-3

我有这个键数组:

["newId", "newFirstName", "newLastName"]

我还有一组看起来像这样的对象:

[{"oldId":1, "oldFirstName":"name1", "oldLastName":"lastName1", ...not impotent data }, { "oldId":2, "oldFirstName":"name2", "oldLastName":"lastName2", ...not impotent data }]

我想要这个数组的结果:

[{"newId":1, "newFirstName":"name1", "newLastName":"lastName1", }, { "newId":2, "newFirstName":"name2", "newLastName":"lastName2", }]

4

1 回答 1

0

如果您可以确定old对象中键的顺序永远不会改变并且永远不会缺少键,那么您可以执行以下操作:

const newKeys = ['newId', 'newFirstName', 'newLastName']

const transform = obj => Object.fromEntries(
  Object.entries(obj)
    .slice(0, newKeys.length)
    .map(([key, value], index) => [newKeys[index], value])
)

const oldArray = [
  {
    oldId: 1,
    oldFirstName: 'A',
    oldLastName: 'B',
    unimportant: 'x'
  },
  {
    oldId: 2,
    oldFirstName: 'C',
    oldLastName: 'D',
    unimportant: 'x'
  }
]

const newArray = oldArray.map(transform)

console.log(newArray)
/* Result:
[
  {
    newId: 1,
    newFirstName: 'A',
    newLastName: 'B'
  },
  {
    newId: 2,
    newFirstName: 'C',
    newLastName: 'D'
  }
]
*/

有什么transform作用:

  • 它将表单中的数据{oldId: 1, oldFirstName: 'A', oldLastName: 'B', unimportant: 'x'}转换为[['oldId', 1], ['oldFirstName', 'A'], ['oldLastName', 'B'], ['unimportant', 'x']]using Object.entries,以便我们可以在其上使用数组方法。
  • 它会切断任何超出使用指定的“新键”数量的条目slice,这样“不重要的数据”就不会被处理,因此[['oldId', 1], ['oldFirstName', 'A'], ['oldLastName', 'B'], ['unimportant', 'x']]变成[['oldId', 1], ['oldFirstName', 'A'], ['oldLastName', 'B']].
  • 它是从到map的所有条目,根据当前条目的索引(它在对象中的数量)从数组中查找,因此变为。[key, value][newKey, value]newKeynewKeys[['oldId', 1], ['oldFirstName', 'A'], ['oldLastName', 'B']][['newId', 1], ['newFirstName', 'A'], ['newLastName', 'B']]
  • 它将修改后的数据从表单[['newId', 1], ['newFirstName', 'A'], ['newLastName', 'B']]转换回{newId: 1, newFirstName: 'A', newLastName: 'B'}使用Object.fromEntries.

最后,我们只需使用map.

注意:如果您的 ECMAScript 版本没有Object.fromEntries,您可以使用 polyfill:Object.fromEntries = a => a.reduce((o, [k, v]) => Object.assign(o, { [k]: v }), {})

于 2020-05-14T08:57:53.390 回答