Transform/map json 为另一种格式

Transform/map json to another format

长JSON对象和小部分如下:

const valueObject = {zipCode: 12345, street1: 'street 1', street2: 'street 2',city:'cityname', uniqueNum: '123456789'};
const mappingObject = {address: {pinCode: zipCode, addressLine1: 'street1', addressLine2:'street2', id: 'uniqueNum', city: city}
const formatObject = {address: {pinCode: '', addressLine1: '', addressLine2:'', id: '0', city: ''}

正在尝试使用 mappingObjectvalueObject 转换为 formatObject。 (如果 valueObject 没有值则使用 formatObject 的默认值) 它没有工作。似乎有一个对象而不是一个数组。不确定这里有什么问题,或者是否需要合并。

Object.keys(formatObject).map((k)=>{k: valueObject[mappingObject[k]] || mappingObject[k]});

预期输出:

{address: {pinCode: 12345, addressLine1: 'street 1', addressLine2: 'street 2',city:'cityname', id: '123456789'};

以防万一,通过 ES6 ( 否则,使用 for 循环并准备对象。 )

你实际上不需要这里的formatObject因为mappingObject给出了完整的转换schema,即两个结构之间的关系。 formatObject 仅作为可能输出的示例。

一个可行的实现是:

function transform(schema, x) {
  return Object.fromEntries(Object.entries(schema).map(([k, v]) => {
    if (typeof v === 'string') return [k, x[v]]
    else if (typeof v === 'object') return [k, transform(v, x)]
    else throw new TypeError(`Schema entry cannot have type ${typeof v}`)
  }))
}

transform(valueObject, mappingObject)

通过模式递归工作,将平面结构对象(在本例中 valueObject)转换为嵌套结构对象。