繁体   English   中英

删除对象属性不是唯一的数组项

[英]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对象的深度或要比较的深度;))

  1. 使用immutablejs -fromJS +比较
  2. 使用JSON.stringify

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM