如何通过索引合并数组中的每个对象?

时间:2018-06-19 00:41:29

标签: javascript arrays javascript-objects

如何合并两个相同长度的对象数组?

var array1 = [
  {name: "lang", value: "English"}, 
  {name: "age", value: "18"}
];
var array2 = [
  {code: "EN", text: "English language"}, 
  {code: "DE", value: "German", text: "German language"}
];

目标是创建以下数组:

var array3 = [
  {name: "lang", value: "English", code: "EN", text: "English language"}, 
  {name: "age", code: "DE", value: "German", text: "German language"}
];

我们的想法是创建一个新的数组,其中array1是基数,array2如果它们共享相同的键,则会覆盖这些值,否则会添加到基数组中。合并应按照对象在每个数组中出现的顺序依次发生。

在这个例子中,数组包含两个对象,但根据我的实际情况,我有几十个对象。

这就是我一直想要做的,但这只会合并第一组对象:

var array3 = Object.assign(array1[0], array2[0]);

我如何循环或映射它?

1 个答案:

答案 0 :(得分:2)

一个map的简单Object.assign会做到这一点。分配给一个新的空对象,以避免改变现有的对象。

var array1 = [
  {name: "lang", value: "English"}, 
  {name: "age", value: "18"}
];
var array2 = [
  {code: "EN", text: "English language"}, 
  {code: "DE", value: "German", text: "German language"}
];

var array3 = array1.map((obj, index) => Object.assign({}, obj, array2[index]));

console.log(array3);

如果您的数组数量不明,请执行以下操作:

const arrays = [
  array1,
  array2,
  array3,
  // …
];

然后你可以使用这种方法:

const mergedArray = Array.from({
  length: arrays[0].length
}, (_, index) => Object.assign({}, ...arrays.map(({[index]: obj}) => obj))));

使用以下示例查看此操作:

const arrays = [
  [
    {a: 3, b: 5},
    {a: 7, b: 2},
    {a: 1}
  ],
  [
    {b: 8, c: 42},
    {a: 1, b: 12, c: 44},
    {b: 0}
  ],
  [
    {d: 14, e: 15},
    {d: 7},
    {a: 10}
  ]
];

console.log(Array.from({
  length: arrays[0].length
}, (_, index) => Object.assign({}, ...arrays.map(({[index]: obj}) => obj))));