Skip to main content

Hello everyone!



I am trying to get an array of unique items which are objects of two keys



{id: "record ID", name: "name of record"}



To filter out duplicate items I use rather complicated way. I define 3 arrays:





  • one for keeping collected data possibly having duplicates and later for cleaned data


  • two others for keeping filtered ids and names





Code looks like this:



let d = [];

let u = [];

let v = [];



d = [{id:1, name:"a"},{id:3, name:"b"},{id:3, name:"b"}];



console.log(d);



u = [...new Set(d.map(d => d.id))];

v = [...new Set(d.map(d => d.name))];

d = [];

let m = 0;

while (m < u.length){ d[m] = {id:u[m],name:v[m]}; m++ }



console.log(d);



As you can see I am using a Set to filter out duplicates. Unfortunately, this works only for simpler arrays (or I do not know how to use it in my case). Is there any easier or brief way to do that? Any valuable suggestion is much appreciated.

Hi @Andrey_Kovalev - I would also reach for Set when trying to get a unique set of values, but Set only works with primitive values or object references (but not actual objects). Here’s a method that doesn’t use Set



let array = y

{id:1, name:"a"},

{id:3, name:"b"},

{id:3, name:"b"},

{id:1, name:"a"},

{id:1, name:"a"},

];



const result = t];

const map = new Map();

for (let item of array) {

if(!map.has(item.id)){

map.set(item.id, true);

result.push(item);

}

}

console.log(result)



This uses Map to note whether or not the loop has already seen a specific id. If not, then the current object is added to the result array; if it has been seen, then we move onto the next item in the array.


@JonathanBowen thank you for your solution. I will definetely try it.


@JonathanBowen thank you for your solution. I will definetely try it.


@JonathanBowen your solution is twice faster than mine. Thanks again for demonstrating how to use Maps. This was new to me.


Reply