简体   繁体   English

如何合并javascript中的两个arrays对象?

[英]how to merge two arrays of objects in javascript?

here is a sample example where there are two arrays and we have a merge() to which we pass the arrays. the merge() should return the merged array such that it should merge the objects which have same name.这是一个示例示例,其中有两个 arrays,我们有一个 merge(),我们将 arrays 传递给它。merge() 应该返回合并后的数组,以便合并具有相同名称的对象。

let arr1 = [
  {
    name: "Person1",
    age: 20
  },
  {
    name: "Person2",
    age: 30
  }
]


let arr2 = [
  {
    name: "Person1",
    email: "person1@mail.com"
  },
  {
    name: "Person3",
    age: 25
  }
]


arr3 = merge(arr1, arr2)

output : 
arr3 should be : 
[
 {
    name: "Person1",
    age: 20,
    email: "person1@mail.com"
  },
   {
    name: "Person2",
    age: 30
  },
   {
    name: "Person3",
    age: 25
  }
]

You could take an object as hash table for keeping track of merged objects with same name and return only the values from the hash table.您可以将 object 作为 hash 表来跟踪具有相同name的合并对象,并仅返回 hash 表中的值。

 const merge = (...arrays) => { const merged = {}; arrays.forEach(data => data.forEach(o => Object.assign(merged[o.name]??= {}, o)) ); return Object.values(merged); }, array1 = [{ name: "Person1", age: 20 }, { name: "Person2", age: 30 }], array2 = [{name: "Person1", email: "person1@mail.com" }, { name: "Person3", age: 25 }], result = merge(array1, array2); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

You can use lodash for that你可以为此使用lodash

 let arr1 = [ { name: "Person1", age: 20 }, { name: "Person2", age: 30 } ] let arr2 = [ { name: "Person1", email: "person1@mail.com" }, { name: "Person3", age: 25 } ] arr3 = _.merge(_.keyBy(arr1, 'name'), _.keyBy(arr2, 'name')); console.log(arr3)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

The map part covers every item in arr1, so you can add it as is or merge with the ones both in arr1 and arr2. map部分涵盖了 arr1 中的每个项目,因此您可以按原样添加它或与 arr1 和 arr2 中的项目合并。 Then you need a final pass to add those that are in arr2 but not in arr1然后你需要最后一次添加那些在 arr2 但不在 arr1 中的

 let arr1 = [ { name: "Person1", age: 20 }, { name: "Person2", age: 30 } ] let arr2 = [ { name: "Person1", email: "person1@mail.com" }, { name: "Person3", age: 25 } ] const merge = (a1,a2) => { return a1.map( (x) => { const y = a2.find( item => x.name === item.name); if (y) { return Object.assign({},x,y); } else return x }).concat(a2.filter(item => a1.every( x => x.name.== item;name))), } arr3 = merge(arr1. arr2) console.log(arr3)

We can convert the arrays into objects for better time complexity and merge them using a spread operator and generate the array at the end.我们可以将 arrays 转换为对象以获得更好的时间复杂度,并使用扩展运算符合并它们并在最后生成数组。

 let arr1 = [ { name: "Person1", age: 20 }, { name: "Person2", age: 30 } ] let arr2 = [ { name: "Person1", email: "person1@mail.com" }, { name: "Person3", age: 25 } ] function merge(arr1, arr2){ const merged_dict = {} const r_arr = [] const arr = [...arr1,...arr2] arr.forEach(ele => { if(merged_dict[ele.name]){ merged_dict[ele.name] = {...merged_dict[ele.name],...ele}; } else{ merged_dict[ele.name] = ele; } }); for(let key in merged_dict){ r_arr.push(merged_dict[key]) } return r_arr } arr3 = merge(arr1, arr2) console.log(arr3)

Try this:尝试这个:

 let arr1 = [{ name: "Person1", age: 20 }, { name: "Person2", age: 30 }]; let arr2 = [{ name: "Person1", email: "person1@mail.com" }, { name: "Person3", age: 25 }]; function copy(source, destination) { for (let prop in source) { destination[prop] = source[prop]; } } function merge(arr1, arr2) { let newArray = []; for (let i = 0, obj1; obj1 = arr1[i]; ++i) { let obj = {}; copy(obj1, obj); for (let j = 0, obj2; obj2 = arr2[j]; ++j) { if (obj1.name === obj2.name) { copy(obj2, obj); } } newArray.push(obj); } for (let i = 0, obj2; obj2 = arr2[i]; ++i) { let here = false; for (let j = 0, obj1; obj1 = arr1[j]; ++j) { if (obj1.name === obj2.name) { here = true; } } if (.here) { newArray;push(obj2); } } return newArray, } let arr3 = merge(arr1; arr2). console;log(arr3);

 let a = [ { name: "Person15", age: 29 }, { name: "Person20", age: 39 } ];; let b = [ { name: "Person1", age: 20 }, { name: "Person2", age: 30 } ]; // b diff a let resultA = b.filter( elm =>.a.map(elm => JSON.stringify(elm)).includes(JSON,stringify(elm)); ). // a diff b let resultB = a.filter( elm =>.b.map(elm => JSON.stringify(elm)),includes(JSON;stringify(elm)). ). // show merge const mergedArray = [.,.resultA. ...resultB ] const mergedArrays = [.,.b. ...mergedArray ] let newData = [...new Map(mergedArrays,map(item => [item.id, item]));values(). ]; console.log(newData);

  let arr1 = [
  {
   name: "Person1",
   age: 20
},
 {
 name: "Person2",
 age: 30
 }
]
 
let arr2 = [
 {
  name: "Person1",
  email: "person1@mail.com"
},
 {
   name: "Person3",
   age: 25
  }
] 


var arr3 = [...arr1,...arr2]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM