繁体   English   中英

结合对象数组的特定属性

[英]combine specific properties of array of objects

如果在组合时在第二个数组中不可用,则为基础“默认”添加默认值

var arrayOne = [{id: 1, name: 'A'},{id:2, name: 'B'},{id:3, name: 'C'},{id:4, name: 'D'},{id:5, name: 'E'}];
var arrayTwo = [{id: 1, basis: 'Online'},{id:3, basis: 'Paper'},{id:4, basis: 'Referrer'}];

一个结果应该是:

var combinedArray = [{id: 1, name: 'A', basis: 'Online'},{id:2, name: 'B', basis: 'Default'},{id:3, name: 'C', basis: 'Paper'},{id:4, name: 'D', basis: 'Referrer'},{id:5, name: 'E', basis: 'Default'}];

我们可以得到从第一个数组中删除名称的数组的其他结果,如下所示

var combinedArray2 = [{id: 1, basis: 'Online'},{id:2, basis: 'Default'},{id:3, basis: 'Paper'},{id:4, basis: 'Referrer'},{id:5, basis: 'Default'}];

我试过了

var combinedArray = []; 
arrayOne.forEach(objOne => {
  arrayTwo.forEach(objTwo => {
    if(objOne.id === ObjTwo.id){
      combinedArray.push({...objOne,...objTwo});
    }
  });
});

是否有任何简单的方法和更快的方法来获得结果数组而无需迭代两次并提高性能

另一种方法是使用 id 作为键创建基础值的 Map 并在第一个数组的映射中查找这些值

 const bMap = new Map(arr2.map(e => [e.id, e.basis])) const res = arr1.map(e => ({...e, basis: bMap.get(e.id) || 'Default' })) console.log(res)
 <script> var arr1 = [{id: 1, name: 'A'},{id:2, name: 'B'},{id:3, name: 'C'},{id:4, name: 'D'},{id:5, name: 'E'}]; var arr2 = [{id: 1, basis: 'Online'},{id:3, basis: 'Paper'},{id:4, basis: 'Referrer'}]; </script>

这是另一种方法:

 var arrayOne = [{id: 1, name: 'A'},{id:2, name: 'B'},{id:3, name: 'C'},{id:4, name: 'D'},{id:5, name: 'E'}]; var arrayTwo = [{id: 1, basis: 'Online'},{id:3, basis: 'Paper'},{id:4, basis: 'Referrer'}]; function groupArrays(arr1, arr2){ return arr1.map(e => { let element = arr2.find(elem=>elem.id==e.id); e['basis'] = element?element['basis']:'Default'; return e; }); } console.log(groupArrays(arrayOne, arrayTwo));

O(constant * n) ~ O(n)的复杂度(其中n是连接数组的长度)

 const arrayOne = [ { id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }, { id: 4, name: "D" }, { id: 5, name: "E" }, ] const arrayTwo = [ { id: 1, basis: "Online" }, { id: 3, basis: "Paper" }, { id: 4, basis: "Referrer" }, ] const lookup = {} const concatArray = arrayOne.concat(arrayTwo) concatArray.forEach((obj) => { lookup[obj.id] = { id: obj.id, ...lookup[obj.id], basis: "Default", ...obj } }) const res = Object.values(lookup) console.log(res)

在 O(n+m) 时间复杂度和 O(n+m) 空间复杂度中。

 var arrayOne = [{id: 1, name: 'A'},{id:2, name: 'B'},{id:3, name: 'C'},{id:4, name: 'D'},{id:5, name: 'E'}]; var arrayTwo = [{id: 1, basis: 'Online'},{id:3, basis: 'Paper'},{id:4, basis: 'Referrer'}]; var obj = {}; arrayOne.forEach(({id, name}) => { obj[id] = {id, name, basis: 'Default'}; }); arrayTwo.forEach(({id, basis}) => { obj[id].basis = basis; }); let result = Object.values(obj); console.log(result);

这是一个可以同时做到的解决方案。

 var arrayOne = [{id: 1, name: 'A'},{id:2, name: 'B'},{id:3, name: 'C'},{id:4, name: 'D'},{id:5, name: 'E'}]; var arrayTwo = [{id: 1, basis: 'Online'},{id:3, basis: 'Paper'},{id:4, basis: 'Referrer'}]; var combinedArray = arrayOne.map(({id, name, basis = 'Default'}) => { arrayTwo.some(obj => (obj.id == id) && (basis = obj.basis)); return { id, name, basis }; //With Name // return { id, basis }; //Without Name }); console.log(combinedArray); // var combinedArray = [{id: 1, name: 'A', basis: 'Online'},{id:2, name: 'B', basis: 'Default'},{id:3, name: 'C', basis: 'Paper'},{id:4, name: 'D', basis: 'Referrer'},{id:5, name: 'E', basis: 'Default'}];

如果第二个数组中的每个 id 只有一个 object 你可以

var combinedArray = arrayOne.map(objOne => {
  let objTwo = arrayTwo.find(objTwo => {
    return objTwo.id === objOne.id
  });
  return {
    basis: 'default',
    ...objOne,
    ...objTwo
  }
});

暂无
暂无

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

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