如何在javascript中合并数组对象

时间:2016-11-28 03:22:07

标签: javascript arrays

我想知道这是否可能

arr1 = [{
  text: "John",
  Description: "tall"
}, {
  text: "Dave",
  Description: "short"
}, {
  text: "Christian",
  Description: "medium"
}, {
  text: "Mark",
  Description: "thin"
}]

arr2 = [{
  text2: "Orange",
  Description2: "sweet"
}, {
  text2: "Prunes",
  Description2: "Bitter"
}, {
  text2: "Apple",
  Description2: "sweet"
}]

我想合并两个数组,看起来像这样

arr3 = [{
  text: "John",
  Description: "tall",
  text2: "Orange",
  Description2: "sweet"
}, {
  text: "Dave",
  Description: "short",
  text2: "Prunes",
  Description2: "Bitter"
}, {
  text: "Christian",
  Description: "medium",
  text2: "Apple",
  Description2: "sweet"
}, {
  text: "Mark",
  Description: "thin"
}]

我曾尝试使用concat(),但它只将合并对象放在第一个数组的末尾,它似乎没有给出我想要的输出。

2 个答案:

答案 0 :(得分:1)

这是使用基本循环执行此操作的简单方法:

var arr3 = [];

for (var i = 0; i < arr1.length || i < arr2.length; i++)
  arr3.push( Object.assign({}, arr1[i], arr2[i]) );

Object.assign() method副本&#34;从一个或多个源对象到目标对象的所有可枚举自有属性的值&#34;,并返回新对象。

在我显示的代码中,Object.assign()的第一个参数是一个新的空对象,第二个参数是arr1中索引为i的元素,并且第三个参数是arr2中的对应元素。注意Object.assign()忽略未定义的参数,即使arr1arr2长度不同(如果i大于或等于arr1.length,这也会有效然后arr1[i]undefinedarr2}也相同。

(展开并运行此代码段以使其正常工作:)

&#13;
&#13;
var arr1 = [{
  text: "John",
  Description: "tall"
}, {
  text: "Dave",
  Description: "short"
}, {
  text: "Christian",
  Description: "medium"
}, {
  text: "Mark",
  Description: "thin"
}];

var arr2 = [{
  text2: "Orange",
  Description2: "sweet"
}, {
  text2: "Prunes",
  Description2: "Bitter"
}, {
  text2: "Apple",
  Description2: "sweet"
}];

var arr3 = [];

for (var i = 0; i < arr1.length || i < arr2.length; i++)
  arr3.push(Object.assign({}, arr1[i], arr2[i]));
console.log(arr3);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

我们首先编写一个循环遍历两个数组的小实用程序例程,然后返回在每对元素上调用一些函数的结果数组,类似于Array#map但是在两个输入上工作阵列:

function map2(a1, a2, fn) {
  const len = Math.max(a1.length, a2.length);
  const result = [];

  for (let i = 0; i < len; i++) {
    result.push(fn(a1[i], a2[i]);
  }

  return result;
}

有了这个,解决方案就是

map2(arr1, arr2, (a1, a2) => Object.assign({}, a1, a2))

请注意Object.assign将忽略undefined,这是我们想要的行为,因为如果一个数组比另一个数组长,就会发生这种情况。

额外信用

我们可以将我们的实用程序扩展到例程,以处理任意数量的输入数组,指定为数组数组,提供的函数采用一组值:

function multiMap(arrays, fn) {
  const len = Math.max(...arrays.map(a => a.length));
  const result = [];

  for (let i = 0; i < len; i++) {
    result.push(fn(arrays.map(a => a[i])));
  }

  return result;
}

然后

multiMap([arr1, arr2], args => Object.assign({}, ...args)