如何根据自定义条件合并两个对象数组?

时间:2018-02-19 11:23:22

标签: javascript arrays merge

以下是两个数组

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.所以它如图所示合并。

4 个答案:

答案 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

中使用带有扩展语法的ES6 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>