为了账号安全,请及时绑定邮箱和手机立即绑定

如何按键合并两个对象数组并在单个对象数组中保留唯一键?

如何按键合并两个对象数组并在单个对象数组中保留唯一键?

慕斯709654 2023-06-29 15:45:12
我想合并两个对象数组,其中具有相同 ID 的对象将合并属性,而具有唯一 ID 的对象将成为合并数组中其自己的对象。以下代码执行第一部分,其中相似的 ID 将合并,但如何将arr2中具有唯一 id 的对象保留在合并数组中,并使其适用于不同长度的数组?预期输出:[  {    "id": "1",    "date": "2017-01-24",    "name": "test"  },  {    "id": "2",    "date": "2017-01-22",    "bar": "foo"  }  { "id": "3",    "foo": "bar",  }]代码:let arr1 = [{    id: '1',    createdDate: '2017-01-24'  },  {    id: '2',    createdDate: '2017-01-22'  },];let arr2 = [{    id: '1',    name: 'test'  },  {    id: '3',    foo: 'bar'  },  {    id: '2',    bar: 'foo'  },];let merged = [];for (let i = 0; i < arr1.length; i++) {  merged.push({      ...arr1[i],      ...arr2.find((itmInner) => itmInner.id === arr1[i].id),    },  );}console.log(merged);
查看完整描述

4 回答

?
MM们

TA贡献1886条经验 获得超2个赞

迭代较大的数组,即包含较小数组的数组:


let arr1=[{id:"1",createdDate:"2017-01-24"},{id:"2",createdDate:"2017-01-22"}],arr2=[{id:"1",name:"test"},{id:"3",foo:"bar"},{id:"2",bar:"foo"}];


const merged = arr2.map(item => ({

  ...arr1.find(({ id }) => id === item.id),

  ...item

}));

console.log(merged);

(如果顺序很重要,您也可以在之后排序)


如果您事先不知道哪个/如果一个将包含另一个,那么首先使用一个对象通过 ID 索引合并的对象:


let arr1=[{id:"1",createdDate:"2017-01-24"},{id:"2",createdDate:"2017-01-22"}],arr2=[{id:"1",name:"test"},{id:"3",foo:"bar"},{id:"2",bar:"foo"}];


const resultObj = Object.fromEntries(

  arr1.map(

    item => [item.id, { ...item }]

  )

);

for (const item of arr2) {

  if (!resultObj[item.id]) {

    resultObj[item.id] = item;

  } else {

    Object.assign(resultObj[item.id], item);

  }

}

const merged = Object.values(resultObj);

console.log(merged);


查看完整回答
反对 回复 2023-06-29
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

您可以编写一个函数将数组缩减为一个对象,然后从该对象中提取值,该对象将返回您想要的值。你可以看到下面的代码:


let arr1 = [

  {

    id: '1',

    createdDate: '2017-01-24',

  },

  {

    id: '2',

    createdDate: '2017-01-22',

  },

];


let arr2 = [

  {

    id: '1',

    name: 'test',

  },

  {

    id: '3',

    foo: 'bar',

  },

  {

    id: '2',

    bar: 'foo',

  },

];


function merge(arr1 = [], arr2 = []) {

  return Object.values(

    arr1.concat(arr2).reduce(

      (acc, curr) => ({

        ...acc,

        [curr.id]: { ...(acc[curr.id] ?? {}), ...curr },

      }),

      {}

    )

  );

}


const merged = merge(arr1, arr2);

输出:


[

  {

    "id": "1",

    "createdDate": "2017-01-24",

    "name": "test"

  },

  {

    "id": "2",

    "createdDate": "2017-01-22",

    "bar": "foo"

  },

  {

    "id": "3",

    "foo": "bar"

  }

]


查看完整回答
反对 回复 2023-06-29
?
守候你守候我

TA贡献1802条经验 获得超10个赞

arr1您可以创建包含和arr2group by键的元素的新对象,id如下所示,合并的数组将存储在对象值上。


您可以使用Object.valuesfunc 获取对象值。


let arr1 = [{

    id: '1',

    createdDate: '2017-01-24'

  },

  {

    id: '2',

    createdDate: '2017-01-22'

  },

];


let arr2 = [{

    id: '1',

    name: 'test'

  },

  {

    id: '3',

    foo: 'bar'

  },

  {

    id: '2',

    bar: 'foo'

  },

];


const groupById = {};

for (let i = 0; i < Math.min(arr1.length, arr2.length); i ++) {

  if (arr1[i]) {

    groupById[arr1[i].id] = { ...groupById[arr1[i].id], ...arr1[i] };

  }

  if (arr2[i]) {

    groupById[arr2[i].id] = { ...groupById[arr2[i].id], ...arr2[i] };

  }

}


const merged = Object.values(groupById);

console.log(merged);


查看完整回答
反对 回复 2023-06-29
?
茅侃侃

TA贡献1842条经验 获得超21个赞

您可以采用单循环方法,将对象存储在哈希表中,并按 排序id。


const

    mergeTo = (target, objects = {}) => o => {

        if (!objects[o.id]) target.push(objects[o.id] = {});

        Object.assign(objects[o.id], o);

    },

    array1 = [{ id: '1', createdDate: '2017-01-24' }, { id: '2', createdDate: '2017-01-22' }],

    array2 = [{ id: '1', name: 'test' }, { id: '3', foo: 'bar' }, { id: '2', bar: 'foo' }],

    merged = [],

    merge = mergeTo(merged);

    

array1.forEach(merge);

array2.forEach(merge);


console.log(merged);

.as-console-wrapper { max-height: 100% !important; top: 0; }


查看完整回答
反对 回复 2023-06-29
  • 4 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信