es6具有set的唯一对象数组

问题描述 投票:9回答:3

我遇到了这个用es6创建唯一数组的例子

[ ...new Set(array) ]

这似乎工作正常,直到我尝试使用一组对象,它没有返回唯一的数组。

let item = [ ...new Set([{id:123,value:'test'},{id:123,value:'test'}]) ];

这是为什么 ?

javascript arrays ecmascript-6
3个回答
8
投票

这是为什么 ?

根据documentation

Set对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。

现在对Set构造函数中每个数组的引用将是不同的,因此构造函数不会将它们视为唯一值。


4
投票

这将有效:

let objectReference = {id:123,value:'test'}
let uniqueArray = [...new Set([objectReference, objectReference])]

>> [{id:123,value:'test'}]

你在做什么:

let objRef1 = {id:123,value:'test'} // creates a reference to a location in memory
let objRef2 = {id:123,value:'test'} // creates a new reference to a different place in memory

let uniqueArray = [...new Set([objRef1, objRef2])]

>> [{id:123,value:'test'},{id:123,value:'test'}]

2
投票

你可以尝试做

uniqueArray = a => [...new Set(a.map(o => JSON.stringify(o)))].map(s => JSON.parse(s))

我知道它很难看,但在大多数情况下除了你在对象参数中有新的Date()之外,还有在stringify上转换为ISO字符串。

那么呢

let arr = [{id:1},{id:1},{id:2}];
uniqueArray(arr) //[{id:1},{id:2}]
© www.soinside.com 2019 - 2024. All rights reserved.