微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

结合对象数组的特定属性

如何解决结合对象数组的特定属性

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

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'},basis: 'Paper'},basis: 'Referrer'}];

一个结果应该是:

var combinedArray = [{id: 1,name: 'A',name: 'B',basis: 'Default'},name: 'C',name: 'D',basis: 'Referrer'},name: 'E',basis: 'Default'}];

能否得到数组的其他结果,该结果从拳头数组中删除名称,如下所示?

var combinedArray2 = [{id: 1,basis: 'Default'}];

我尝试过

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

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

解决方法

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

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'},basis: 'Paper'},basis: 'Referrer'}];
</script>

,

这是另一种方法:

var arrayOne = [{id: 1,name: 'E'}];
var arrayTwo = [{id: 1,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" },basis: "Paper" },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,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,basis: 'Referrer'}];

var combinedArray = arrayOne.map(({id,basis = 'Default'}) => {
    arrayTwo.some(obj => (obj.id == id) && (basis = obj.basis));
    return { id,basis }; //With Name
    // return { id,basis }; //Without Name
});

console.log(combinedArray);
// var combinedArray = [{id: 1,name: 'A',name: 'B',basis: 'Default'},name: 'C',name: 'D',basis: 'Referrer'},name: 'E',basis: 'Default'}];

,

如果第二个数组中每个id只有一个对象,则可以

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。