将 json 转换/映射为另一种格式

Transform/map json to another format

提问人:TechS 提问时间:7/14/2021 最后编辑:TechS 更新时间:7/14/2021 访问量:91

问:

有很长的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: ''}

尝试转换为使用 . (如果没有值,则使用默认值 from ) 它没有工作。似乎有一个对象而不是数组。不知道这里出了什么问题,还是需要合并。valueObjectformatObjectmappingObjectvalueObjectformatObject

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 循环和准备对象。)

JavaScript JSON ECMAScript-2017

评论

0赞 daylily 7/14/2021
不知道你在问什么。似乎您的代码将返回一个数组。但是你说你有一个对象而不是一个数组。
0赞 TechS 7/14/2021
是的,上面的代码返回数组。但需要单个对象作为,只需要值需要从中挑选。formatObjectvalueObject

答:

1赞 daylily 7/14/2021 #1

您实际上不需要 here,因为 给出了完整的转换模式,即两个结构之间的关系。 仅作为可能输出的示例。formatObjectmappingObjectformatObject

一个可行的实现是:

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

评论

0赞 TechS 7/14/2021
谢谢,为我工作。Object.fromEntriesObject.entries