Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove all duplicates from an array of objects?

I have an object that contains an array of objects.

obj = {};  obj.arr = new Array();  obj.arr.push({place:"here",name:"stuff"}); obj.arr.push({place:"there",name:"morestuff"}); obj.arr.push({place:"there",name:"morestuff"}); 

I'm wondering what is the best method to remove duplicate objects from an array. So for example, obj.arr would become...

{place:"here",name:"stuff"}, {place:"there",name:"morestuff"} 
like image 570
Travis Avatar asked Feb 08 '10 00:02

Travis


People also ask

How do you remove duplicates from an array of arrays?

To remove duplicates from an array: First, convert an array of duplicates to a Set . The new Set will implicitly remove duplicate elements. Then, convert the set back to an array.


1 Answers

How about with some es6 magic?

obj.arr = obj.arr.filter((value, index, self) =>   index === self.findIndex((t) => (     t.place === value.place && t.name === value.name   )) ) 

Reference URL

A more generic solution would be:

const uniqueArray = obj.arr.filter((value, index) => {   const _value = JSON.stringify(value);   return index === obj.arr.findIndex(obj => {     return JSON.stringify(obj) === _value;   }); }); 

Using the above property strategy instead of JSON.stringify:

const isPropValuesEqual = (subject, target, propNames) =>   propNames.every(propName => subject[propName] === target[propName]);  const getUniqueItemsByProperties = (items, propNames) =>    items.filter((item, index, array) =>     index === array.findIndex(foundItem => isPropValuesEqual(foundItem, item, propNames))   ); 

You can add a wrapper if you want the propNames property to be either an array or a value:

const getUniqueItemsByProperties = (items, propNames) => {   const propNamesArray = Array.from(propNames);    return items.filter((item, index, array) =>     index === array.findIndex(foundItem => isPropValuesEqual(foundItem, item, propNamesArray))   ); }; 

allowing both getUniqueItemsByProperties('a') and getUniqueItemsByProperties(['a']);

Stackblitz Example

Explanation

  • Start by understanding the two methods used:
    • filter, findIndex
  • Next take your idea of what makes your two objects equal and keep that in mind.
  • We can detect something as a duplicate, if it satisfies the criterion that we have just thought of, but it's position is not at the first instance of an object with the criterion.
  • Therefore we can use the above criterion to determine if something is a duplicate.
like image 64
Eydrian Avatar answered Oct 08 '22 06:10

Eydrian