首页 > 解决方案 > 如何首先组合对象的属性,然后使用 Javascript 删除对象数组中的重复项

问题描述

我在这里有一个对象数组:

const arr = [
  { id: 1, name: "test1", quantity:1 },
  { id: 2, name: "test2", quantity:1 },
  { id: 2, name: "test3", quantity:1 },
  { id: 3, name: "test4", quantity:1 },
  { id: 4, name: "test5", quantity:1 },
  { id: 5, name: "test6", quantity:1 },
  { id: 5, name: "test7", quantity:1 },
  { id: 6, name: "test8", quantity:1 }
];

我想在删除它们之前一起添加数量的重复对象

所以结果是:

const arr = [
  { id: 1, name: "test1", quantity:1 },
  { id: 2, name: "test3", quantity:2 },
  { id: 3, name: "test4", quantity:1 },
  { id: 4, name: "test5", quantity:1 },
  { id: 5, name: "test6", quantity:2 },
  { id: 6, name: "test8", quantity:1 }
];

我已经看到它的变体使用 map 或 reduce 删除了重复项,但我还没有看到任何可以在不使用太多循环的情况下以雄辩的方式完成的任务。

我一直在思考如何最好地完成这一天并没有找到任何东西,任何帮助将不胜感激

标签: javascriptarrays

解决方案


您可以将 reduce 与对象一起使用来存储具有每个 id 的元素。

const arr = [
  { id: 1, name: "test1", quantity:1 },
  { id: 2, name: "test2", quantity:1 },
  { id: 2, name: "test3", quantity:1 },
  { id: 3, name: "test4", quantity:1 },
  { id: 4, name: "test5", quantity:1 },
  { id: 5, name: "test6", quantity:1 },
  { id: 5, name: "test7", quantity:1 },
  { id: 6, name: "test8", quantity:1 }
];
const res = Object.values(
  arr.reduce((acc,curr)=>{
  acc[curr.id] = acc[curr.id] || {...curr, quantity: 0};
  acc[curr.id].quantity += curr.quantity;
  return acc;
  }, {})
);
console.log(res);


推荐阅读