我正在尝试将两个对象数组合并在一起。
我已经预先排列了对象数组,以便它们匹配,我只需要在两个数组中的每个对象上推送属性。
我认为lodash会给我一个比双循环更清晰的解决方案,或者我应该只做一个vanilla JS解决方案?
两个数组的示例:
[
{
provider: 'foo',
title: 'Title1'
},
{
provider: 'bar',
title: 'Title2'
}
]
[
{
all: '0',
novelty: '24'
},
{
all: '4',
novelty: '12'
}
]
它应该返回:
[
{
provider: 'foo',
title: 'Title1',
all: '0',
novelty: '24'
},
{
provider: 'bar',
title: 'Title2',
all: '4',
novelty: '12'
}
]
答案 0 :(得分:2)
如果没有lodash,您可以使用Array.prototype.map()
和Object.assign()
(或angular.merge()
如果目标浏览器不支持分配):
var arr1 = [{
provider: 'foo',
title: 'Title1'
}, {
provider: 'bar',
title: 'Title2'
}];
var arr2 = [{
all: '0',
novelty: '24'
}, {
all: '4',
novelty: '12'
}];
var result = arr1.map(function(item, index) {
return Object.assign({}, item, arr2[index]);
});
console.log(result);
如果您想使用lodash,请_.zipWith()
使用_.assign()
:
var arr1 = [{
provider: 'foo',
title: 'Title1'
}, {
provider: 'bar',
title: 'Title2'
}];
var arr2 = [{
all: '0',
novelty: '24'
}, {
all: '4',
novelty: '12'
}];
var result = _.zipWith(arr1, arr2, function(a, b) {
return _.assign({}, a, b);
});
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>
答案 1 :(得分:2)
您可以使用ES6执行此操作:
data1.map( (obj, i) => Object.assign({}, obj, data2[i]) )
var data1 = [{
provider: 'foo',
title: 'Title1'
}, {
provider: 'bar',
title: 'Title2'
}];
var data2 = [{
all: '0',
novelty: '24'
}, {
all: '4',
novelty: '12'
}];
var merged = data1.map( (obj, i) => Object.assign({}, obj, data2[i]) );
console.log(merged);
答案 2 :(得分:0)
到目前为止,这个问题的其他答案都是次优的,因为它们忽略了输入数组预先排序的陈述条件。 AFAIK lodash没有预先构建的方法来合并排序的数组,但谷歌搜索&#34;合并排序的数组&#34;将揭示许多伪代码来模仿。
例如,这里是http://www.algolist.net/Algorithms/Merge/Sorted_arrays的JS实现:
const mergeSortedArraysBy = (array1, array2, iteratee) => {
const mergedArray = [];
let i = 0;
let j = 0;
while (i < array1.length && j < array2.length) {
if (iteratee(array1[i]) <= iteratee(array2[j])) {
mergedArray.push(array1[i]);
i++;
} else {
mergedArray.push(array2[j]);
j++;
}
}
if (i < array1.length) {
for (let p = i; p < array1.length; p++) {
mergedArray.push(array1[p]);
}
} else {
for (let p = j; p < array2.length; p++) {
mergedArray.push(array2[p]);
}
}
return mergedArray;
};