JavaScript:连接对象数组

时间:2019-03-11 04:29:15

标签: javascript arrays

我有两个对象数组,如下所示:

array_1 = [
            {'id': 1},
            {'id': 2},
            {'id': 3},
            {'id': 4},
            {'id': 5}
          ];
array_2 = [
            {'name': 'Doe', 'age': 45},
            {'name': 'John', 'age': 35}
          ];

我想将这两个数组连接起来,使一个数组像这样:

result_array = [
                 {'id': 1, 'name': 'Doe', 'age': 45},
                 {'id': 2, 'name': 'John', 'age': 35},
                 {'id': 3},
                 {'id': 4},
                 {'id': 5}
               ]

我尝试过:

var result_array = array_1.concat(array_2);

但是它给出了:

result_array = [
                 {'name': 'Doe', 'age': 45},
                 {'name': 'John', 'age': 35},
                 {'id': 1},
                 {'id': 2},
                 {'id': 3},
                 {'id': 4},
                 {'id': 5}
              ]

我该怎么做?

7 个答案:

答案 0 :(得分:2)

您所需的输出表明,您需要合并数组中匹配位置(而非串联)的对象。

您可以使用Array.prototype.map()

  

map()方法创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

Object.assign()

  

Object.assign()方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

尝试以下方式:

var array_1 = [
            {'id': 1},
            {'id': 2},
            {'id': 3},
            {'id': 4},
            {'id': 5}
          ];
var array_2 = [
            {'name': 'Doe', 'age': 45},
            {'name': 'John', 'age': 35}
          ];

var result_array = array_1.map((obj, idx) => {
  if(idx < array_2.length){
    obj = Object.assign(obj, array_2[idx]);
  }
  return obj;
});

console.log(result_array);

答案 1 :(得分:1)

又一种方法:

let array_1 = [
            {'id': 1},
            {'id': 2},
            {'id': 3},
            {'id': 4},
            {'id': 5}
          ]
let array_2 = [
            {'name': 'Doe', 'age': 45},
            {'name': 'John', 'age': 35}
          ]

let tmp = array_1.length > array_2.length ? array_1 : array_2

let result = tmp.reduce((acc, val, i) => {
  acc.push({...(array_1[i] || []), ...(array_2[i] || [])})
  return acc
}, [])

console.log(result)

如果array_1小于array_2,我将检查最长的数组以合并那些数组。

答案 2 :(得分:0)

遍历array_1,并为array_1中的每个对象创建一个包含array_1 [i]和array_2 [i]内容的新对象,其中i是您的for循环迭代器。将这个新对象推入新数组。

您可以使用Object.assign()串联这两个对象。

答案 3 :(得分:0)

array1 = [
            {'id': 1},
            {'id': 2},
            {'id': 3},
            {'id': 4},
            {'id': 5}
          ];

array2 = [
            {'name': 'Doe', 'age': 45},
            {'name': 'John', 'age': 35}
          ];

          var newArray = [];
for (var i = 0; i < array1.length; i++) {
    var obj = array1[i];
    if (array2[i]) {
        for (key in array2[i]) {
            obj[key] = array2[i][key];
        }
        newArray.push(obj);
    }
};


          console.log(Object.assign(array1, newArray))

答案 4 :(得分:0)

在这种情况下,Concat不是您想要的,您想使用map。

这样的事情,

array_3 = array_1.map(function(a, i){
    if(i < array_2.length){
        return Object.assign({},a, array_2[i]);
    }
    else {
        return a;
    }
});

注意:您可能需要进行其他检查,以确保array_2比array_1长/大的条件。

答案 5 :(得分:0)

使用数组Element.dataset.param1,并在每次迭代期间检查reduce中的索引中是否具有和array_1对应的元素

array_2

答案 6 :(得分:0)

您可以按以下方式使用它,Object.assign-添加两个不同的匹配对象和接头-取消设置元素并将对象附加在数组的开头。

array_1 = [
            {'id': 1},
            {'id': 2},
            {'id': 3},
            {'id': 4},
            {'id': 5}
          ]
array_2 = [
            {'name': 'Doe', 'age': 45},
            {'name': 'John', 'age': 35}
          ]

var obj;
for (let key of array_1.keys()) 
{
	for (let key1 of array_2.keys()) 
	{
		if(key == key1)
		{
			obj = Object.assign({}, array_1[key], array_2[key]); // Assigns matched keys 
			array_1.splice(key, 1); // Remove the matched keys from array_1
			array_1.unshift(obj); // appends the object to array_1
		}
	}
}
console.log(array_1.sort());