使用Java中的Set删除重复项

时间:2018-07-25 11:21:37

标签: javascript duplicates set

我正在努力尝试一些非常简单的事情。我有一个对象数组。我需要基于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评论中的建议是解决整个问题的好方法。谢谢大家。

4 个答案:

答案 0 :(得分:5)

您可以将filterSet一起使用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 {},但实际上,浏览器控制台打印了其他内容。

enter image description here

要确保列表不为空,请使用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);