es6具有set的唯一对象数组

Ste*_*ieB 10 javascript arrays ecmascript-6

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

[ ...new Set(array) ]
Run Code Online (Sandbox Code Playgroud)

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

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

这是为什么 ?

Vic*_*Vic 14

你可以尝试做

uniqueArray = a => [...new Set(a.map(o => JSON.stringify(o)))].map(s => JSON.parse(s))
Run Code Online (Sandbox Code Playgroud)

我知道它很难看,但在大多数情况下,除了对象参数中有 new Date() 的地方,然后在 stringify 上将其转换为 ISO 字符串。

那么做

let arr = [{id:1},{id:1},{id:2}];
uniqueArray(arr) //[{id:1},{id:2}]
Run Code Online (Sandbox Code Playgroud)


gur*_*372 10

这是为什么 ?

根据文件

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

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


Tra*_*ter 5

This will work:

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

>> [{id:123,value:'test'}]
Run Code Online (Sandbox Code Playgroud)

What you're doing:

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'}]
Run Code Online (Sandbox Code Playgroud)