如何在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)
})
让我们来剖析一下这个烂摊子:
Array.from(new Set())我要创建一个新集合,我想把它转换回数组,Array.from以便以后可以重新映射它。new Set(addresses.map(a => a.id))集合只允许包含唯一值,所以我将把每个对象的 ID 传递给它。如果循环尝试再次添加相同的值,它将被忽略。.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;
}
}, []);