[英]Remove array items where object property is not unique
我有一个包含对象的数组,我需要根据data-itemid
删除重复项。
这是我的代码:
const ListItemsUnique = []
ListItems.map(item => {
if (ListItemsUnique.indexOf(item.props['data-itemid']) === -1) {
ListItemsUnique.push(item)
}
});
它返回与以前完全相同的数组,我在做什么错呢?
如果您使用的是ES6,请尝试此操作,
const ListItemsUnique = [...new Set(ListItems.map(item => item.props['data-itemid']))];
编辑1:
let data = [
{
name: 'John',
"data-itemid": 2
},
{
name: 'Doe',
"data-itemid": 1
},
{
name: 'James',
"data-itemid": 1
},
{
name: 'Clerk',
"data-itemid": 2
}
];
// Use Map (ES6) to retain only unique elements
let map = new Map();
for (element of data) {
map.set(element["data-itemid"], element);
}
var filteredData = [];
map.forEach( (value) => {
filteredData.push(value);
});
console.log(filteredData,"filteredData");
演示: https : //codepen.io/vedp/pen/RpmVvx? editors =0011
最简单,最干净的方法是使用临时集存储在映射过程中先前返回到阵列的项目。 像这样:
let tempSet = new Set();
const ListItemsUnique = ListItems.filter(item => {
if(!tempSet.has(item.props['data-itemid'])) {
tempSet.add(item.props['data-itemid']);
return item;
}
});
然后照常进行映射。
let ListItems = [ {name: "A", props: {"data-itemid": 1}}, {name: "B", props: {"data-itemid": 1}}, {name: "C", props: {"data-itemid": 2}}, {name: "D", props: {"data-itemid": 3}}, {name: "E", props: {"data-itemid": 3}}, ]; //mock data let tempSet = new Set(); const ListItemsUnique = ListItems.filter(item => { if(!tempSet.has(item.props['data-itemid'])) { tempSet.add(item.props['data-itemid']); return item; } }) console.log(ListItemsUnique.map(item => item.name)); //Items "B" and "E" are skipped
顺便说一下, Set
非常适合处理或希望获得唯一的数据收集。 阅读MDN以获取有关Set
更多信息。
这是文档的摘录:
Set
对象是值的集合。 您可以按插入顺序遍历集合的元素。Set
的值只能出现一次; 它在Set
的集合中是唯一的。
您还可以使用不可变的js或JSON.stringify(取决于ur对象的深度或要比较的深度;))
JSON.stringify的示例
const ListItems = [{a: 'a'}, {a: 'b'}, {a: 'a'}]; let ListItemsUnique = []; let stringList = []; ListItems.forEach(item => { const itemString = JSON.stringify(item); if (stringList.indexOf(itemString) === -1) { ListItemsUnique.push(item); } stringList.push(itemString); }) console.log(ListItemsUnique);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.