Javascript es6具有集合的唯一对象数组

Javascript es6具有集合的唯一对象数组,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我遇到了这个使用es6创建独特阵列的示例 [ ...new Set(array) ] 这似乎很好,直到我尝试使用一个对象数组,但它没有返回唯一的数组 i、 e 为什么呢 为什么呢 依照 Set对象允许您存储任何类型的唯一值,无论 基本值或对象引用 现在,集合构造函数中的每个数组的引用都将不同,因此构造函数不认为它们是唯一的值。这将起作用: let objectReference = {id:123,value:'test'} let uniqueArray = [...new Set([obj

我遇到了这个使用es6创建独特阵列的示例

[ ...new Set(array) ]
这似乎很好,直到我尝试使用一个对象数组,但它没有返回唯一的数组

i、 e

为什么呢

为什么呢

依照

Set对象允许您存储任何类型的唯一值,无论 基本值或对象引用

现在,
集合
构造函数中的每个数组的引用都将不同,因此构造函数不认为它们是唯一的值。

这将起作用:

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'}]
你可以试着去做

uniqueArray = a => [...new Set(a.map(o => JSON.stringify(o)))].map(s => JSON.parse(s))
我知道这很难看,但在大多数情况下,除了在对象参数中有新的Date(),然后在stringify上转换为ISO string之外,它还可以工作

那就这么办吧

let arr = [{id:1},{id:1},{id:2}];
uniqueArray(arr) //[{id:1},{id:2}]

你说的“不起作用”是什么意思
[…新集合([{val:1},{val:2},{val:3}])]
给了我一个对象数组…通过使用集合,我希望得到一个过滤后的唯一数组。这与
集合
无关,两个对象从来都不一样,即使它们包含相同的值,我猜这是另一个可能的重复。我遇到了这个问题,我意识到我在控制台中使用完全相同的语法编写了相同的示例:-),但是,这个解决方案不适用于regexp:
a=[{b:/foo/},{b:/bar/}]
将返回
[{b:{}]
只有这一个正在处理Mongoose文档。
let arr = [{id:1},{id:1},{id:2}];
uniqueArray(arr) //[{id:1},{id:2}]