【问题标题】:How can I merge two arrays of objects, possibly different lengths, filtering out some values based on a property [duplicate]如何合并两个对象数组,可能长度不同,根据属性过滤掉一些值[重复]
【发布时间】:2022-11-24 03:35:41
【问题描述】:

假设我有两个如下所示的数组:

const arr1 = [
    {id:1, value:25},
    {id:2, value:15},
    {id:3, value:35}
];

const arr2 = [
    {id:3, value:95},
    {id:4, value:65}
];

我想要第三个数组,其中包含具有唯一 ID 的 3 个项目,但对于具有重复 ID (id:3) 的两个对象 - 我想保留相同的 ID 并添加值。结束了类似...

const arr3 = [
    {id:1, value:25},
    {id:2, value:15},
    {id:3, value:130},
    {id:4, value:65},
];

所以我需要最有效的方法来找到具有相同 ID 的对象,然后执行一些逻辑来合并它们的值并将合并的对象添加回新的组合数组。

【问题讨论】:

  • 出了什么问题?
  • const arr3 = Array.from([ ...arr1, ...arr2 ].reduce((idToSum, { id, value }) => idToSum.set(id, (idToSum.get(id) ?? 0) + value), new Map()), ([ id, value ]) => ({ id, value }));
  • @NinaScholz - 我尝试映射到其中一个数组,并使用 .includes 查找重复项 - 但首先 - 我需要比较数组对象内的属性,而不是对象本身。其次,数组的长度可能不同。

标签: javascript arrays


【解决方案1】:

const arr1 = [
    {id:1, value:25},
    {id:2, value:15},
    {id:3, value:35}
];

const arr2 = [
    {id:3, value:95},
    {id:4, value:65}
];

const res = [...arr1, ...arr2].reduce((a, {id, value}) => ({...a, [id]: a[id] ? {id, value: a[id].value + value} : {id, value}}), {});

console.log(Object.values(res));

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 2016-05-15
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2015-05-29
    • 2021-04-21
    • 2018-05-25
    相关资源
    最近更新 更多