简体   繁体   中英

es6 unique array of objects with set

I came across this example for creating unique arrays with es6

[ ...new Set(array) ]

Which seems to work fine until I tried it with an array of objects and it didn't return unique array.

ie

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

Why is that ?

Why is that ?

As per documentation

The Set object lets you store unique values of any type, whether primitive values or object references .

Now reference for each of those arrays inside that Set constructor will be different so they are not considered to be a unique value by the constructor.

This will work:

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

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

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'}]

you can try to do

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

I know its ugly as hell but in most cases works apart from where you have new Date() in your object param then that on stringify be converted to ISO string.

so then do

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM