我正在努力尝试一些非常简单的事情。我有一个对象数组。我需要基于id
属性从此数组中删除重复项。因此,我想创建一个包含我的ID的Set
,如下所示:
let myArray = [{
id: 10,
other: "bla"
},
{
id: 15,
other: "meh"
},
{
id: 10,
other: "bla"
}
]
let indexes = new Set();
myArray.forEach(a => indexes.add(a.id));
console.log('indexes list', indexes)
但是indexes
始终为空。我究竟做错了什么?谢谢。
编辑:我选择@Hyyan Abo Fakher的正确答案是因为他是正确的,但是@bambam评论中的建议是解决整个问题的好方法。谢谢大家。
答案 0 :(得分:5)
您可以将filter
与Set
一起使用id
方法来创建新的唯一对象数组。
const data = [{id: 10, other: "bla"},{id: 15, other: "meh"},{id: 10, other: "bla"}]
let result = data.filter(function({id}) {
return !this.has(id) && this.add(id);
}, new Set)
console.log(result)
答案 1 :(得分:1)
您可以检查集合是否具有ID,如果没有,则将元素推送到新数组。最终的数组将具有唯一的元素。
var source = [
{id: 10, other: "bla"},
{id: 15, other: "meh"},
{id: 10, other: "bla"}
];
var set = new Set();
var result = [];
source.forEach(item => {
if (!set.has(item.id)) {
set.add(item.id);
result.push(item);
}
})
console.log(result);
答案 2 :(得分:1)
我们可以使用数组在循环的帮助下解决此问题。如下所示:
var b = [];
a.forEach(function(index){
if(b[index.id]==undefined){
b[index.id] = index.other;
}
});
console.log(b);
这是原始的源数组。
答案 3 :(得分:1)
但是索引始终为空。我在做什么错了?
您的代码是完全可以使用的,问题似乎出在浏览器控制台本身,您希望将set
打印到控制台会像数组一样打印集合的项目,但实际上,浏览器会仅显示对象实例
在StackOverflow上运行代码将打印indexes list {}
,但实际上,浏览器控制台打印了其他内容。
要确保列表不为空,请使用size
属性
let myArray = [{
id: 10,
other: "bla"
},
{
id: 15,
other: "meh"
},
{
id: 10,
other: "bla"
}
]
let indexes = new Set();
myArray.forEach(a => indexes.add(a.id));
console.log('indexes list', indexes.size)
要遍历集合,您需要使用for ... of
let myArray = [{
id: 10,
other: "bla"
},
{
id: 15,
other: "meh"
},
{
id: 10,
other: "bla"
}
]
let indexes = new Set();
myArray.forEach(a => indexes.add(a.id));
for (let item of indexes) console.log(item);