以下是两个数组
arr1 = [
{ item1: 1, id: 1 },
{ item1: 4, id: 3 }
];
arr2 = [
{ item2: 1, id: 2 },
{ item2: 2, id: 3 }
];
我需要像
这样的合并数组 arr3 = [
{ item1: 1, id: 1 },
{ item2: 1, id: 2 },
{ item1: 4, item2: 2, id: 3 }
];
如何实现这一目标?
编辑:如果两个数组都有相同ID的对象,那么我想合并它。在示例中,每个对象都有两个数组,其中ID为3.所以它如图所示合并。
答案 0 :(得分:1)
╔═══════╦════════╦═════════╦════════╗
║ B ║ C ║ E ║ F ║
╠═══════╬════════╬═════════╬════════╣
║ David ║ George ║ Stephen ║ Martin ║
║ Aron ║ Cathy ║ Allen ║ Lilly ║
║ Vinod ║ Wills ║ Calvin ║ Olive ║
║ ║ ║ Danies ║ Harry ║
╚═══════╩════════╩═════════╩════════╝
您的数组和基于array#concat
使用id
的对象对对象进行分组,合并具有相同array#reduce
的对象。然后使用id
提取所有值。
Object.values()
答案 1 :(得分:0)
您可以这样做:
var arr1 = [
{ item1: 1, id: 1 },
{ item1: 4, id: 3 }
];
var arr2 = [
{ item2: 1, id: 2 },
{ item2: 2, id: 3 }
];
var hash = {};
arr1.forEach(elem => { hash[elem.id] = {...hash[elem.id], ...elem} });
arr2.forEach(elem => { hash[elem.id] = {...hash[elem.id], ...elem} });
var result = Object.keys(hash).map(id => hash[id]);
我试图做的是构建一个这样的对象:
{
1: { item1: 1, id: 1 }
2: { item2: 2, id: 2 },
3: { item1: 4, item2: 2, id: 3 }
}
然后以您想要的格式将其转换回数组
注意:我还没有测试过这段代码。
答案 2 :(得分:0)
您可以在数组和Map
Object.assign
const arr1 = [{ item1: 1, id: 1 },{ item1: 4, id: 3 }];
const arr2 = [{ item2: 1, id: 2 },{ item2: 2, id: 3 }];
const map = [...arr1, ...arr2].reduce((r, e) => {
return r.set(e.id, Object.assign({}, r.get(e.id), e)), r
}, new Map)
const result = [...map.values()]
console.log(result)
答案 3 :(得分:0)
使用LoDash:
var arr1 = [
{ item1: 1, id: 1 },
{ item1: 4, id: 3 }
];
var arr2 = [
{ item2: 1, id: 2 },
{ item2: 2, id: 3 }
];
var ids1 = _.map(arr1, 'id');
var ids2 = _.map(arr2, 'id');
var ids = _.concat(ids1, ids2);
var uniq_ids = _.uniq(ids);
var result = [];
for(var i = 0; i < uniq_ids.length; i++) {
var ob1 = _.find(arr1, {id: uniq_ids[i]});
var ob2 = _.find(arr2, {id: uniq_ids[i]});
result.push(_.merge(ob1, ob2));
}
console.log(result);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>