2017-12-27 178 views
0

我有对象数组以这种形式:对象的ECMAScript 6(ES6)的集

[ 
{id : #mixed char and num , title : #string }, 
{id : #mixed char and num , title : #string } ...] 

我想来遍历它并删除重复的对象中,我使用设置结构这样做,但问题是,设置运营方将接受复制的对象 我试图

let Unique = new Set([], X => x.id) 

但不会帮助

+2

你为什么不创建一个空的数组和迭代通过初始数组只添加唯一项到新数组?你必须将这些项目与你自己的比较函数进行比较,因为obj1!== obj2总是。 –

+0

@ViktorKireev这将工作,但我正在寻找smth来扩展设置数据结构 –

+1

这些都是不同的对象引用。一套看起来好像它们是独一无二的。设置没有一个过滤器函数作为第二个参数我不认为有一种方法来使用这个集。 –

回答

1

由于the reference状态,

设定的对象,您可以存储任何类型的唯一值,无论是原始值或对象引用。

如果这些是不同的对象引用,它们将不会被重复数据删除。如果对象需要通过id唯一密钥进行标识,那么Set是错误的选择。一个地图可以达到这个目的:

new Map([ 
    [#mixed char and num, {id : #mixed char and num , title : #string }], 
    ... 
]) 

如果对象不包含任何东西,但idtitle,地图可以简化为:

new Map([ 
    [#mixed char and num, #string], 
    ... 
]) 
1

您可以删除所有的重复与.filter

let uniqueArr = arr.filter((item, index) => { 
    return arr.findIndex(item2 => item2.id === item.id) === index; 
}); 

小提琴demoing概念:https://jsfiddle.net/4oanw972/

1

你可以使用reduceesmascript 6map然后值传递给Set构造。然而,你可以在es6

new Set(arr.reduce((map,item)=>map.set(item.id, item), new Map()).values()); 

正常使用Object为好,Object.values因为你知道你正在identifing通过id唯一的,这样只是创建id的关键指向实际的对象,因此,用相同的ID前面的物体它将会覆盖,你将最终得到只有一个对象对每个id,然后只是得到价值和构建你的设置。