发布于 2026-01-05 4 阅读
0

如何在JS中使用Set删除对象数组中的重复项

如何在JS中使用Set删除对象数组中的重复项

前几天在工作中,我遇到了一个我认为在处理来自 API 的数据时相当常见的问题。

我从异步 http 调用中获取了一个array of objects(在本例中是地址),但由于一些无关紧要的原因,这个数组返回的对象可能是重复的(因此有两个相同的ids)。

我的第一反应是创建一个新数组,然后遍历地址数组,.findIndex对每个地址执行一次“副本”操作。如果“副本”中没有对应的地址,就将其添加到新数组中。最终代码虽然可读性不错,但我想要一种更简洁直接的方法。

解决这个问题有很多方法!

既然我们已经解决了这个问题😋,我想展示一下这个利用JavaScriptSet强大功能的解决方案。

const addresses = [...]; // Some array I got from async call

const uniqueAddresses = Array.from(new Set(addresses.map(a => a.id)))
 .map(id => {
   return addresses.find(a => a.id === id)
 })

让我们来剖析一下这个烂摊子:

  1. Array.from(new Set())我要创建一个新集合,我想把它转换回数组,Array.from以便以后可以重新映射它。
  2. new Set(addresses.map(a => a.id))集合只允许包含唯一值,所以我将把每个对象的 ID 传递给它。如果循环尝试再次添加相同的值,它将被忽略。
  3. .map(id => [...])利用第一步得到的 ID 数组,我对其运行 map 函数,并返回原始地址数组中的实际地址。

就是这样!简单明了,而且学习/使用过程也很有趣Set😎


特别感谢我的宝贝Natalia Tepluhina,她一直陪伴我,帮我想出了很多疯狂的点子,Array.reduce下面展示的就是她超棒的解决方案 ❤️👩‍💻

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

const filteredArr = arr.reduce((acc, current) => {
  const x = acc.find(item => item.id === current.id);
  if (!x) {
    return acc.concat([current]);
  } else {
    return acc;
  }
}, []);
文章来源:https://dev.to/marinamosti/removing-duplicates-in-an-array-of-objects-in-js-with-sets-3fep