我想知道这是否可能
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(),但它只将合并对象放在第一个数组的末尾,它似乎没有给出我想要的输出。
答案 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()
忽略未定义的参数,即使arr1
和arr2
长度不同(如果i
大于或等于arr1.length
,这也会有效然后arr1[i]
将undefined
,arr2
}也相同。
(展开并运行此代码段以使其正常工作:)
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;
答案 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)