Removing duplicate objects in an array of objects in JavaScript

Object1 = {connectorIndex: 1, nodeID: 6, Connectors: Object} Object2 = {connectorIndex: 1, nodeID: 6, Connectors: Object} Connector: {name: "ALAND", key: "", description: "Departure country (country from which the goods are sent)"} 

There are two objects in one array. Connector objects are identical. How to remove duplicate elements and get the final array with one object?

 var array = [object 1, object 2]; 

object 2 is the duplicate to remove from the array.

+6
source share
5 answers

this would do it if you are looking for exact matches:

 function remove_duplicates(objectsArray) { var usedObjects = {}; for (var i=objectsArray.length - 1;i>=0;i--) { var so = JSON.stringify(objectsArray[i]); if (usedObjects[so]) { objectsArray.splice(i, 1); } else { usedObjects[so] = true; } } return objectsArray; } var objectsArray = [{a:'foo',b:'bar'}, {a:'foo',b:'bar'}]; var clean = remove_duplicates(objectsArray); 
+13
source

The problem with using JSON.stringify is that if the object can contain a circular reference, then it throws an exception, for example.

 var x1 = {}; x1.a = x1; JSON.stringify(x1); // <- Uncaught TypeError: Converting circular structure to JSON 

As mentioned, however, if you are comparing objects, not values, then you cannot just do an equality comparison, as this will always be false for different objects (even if they have the same properties with the same values).

If you were just comparing the values, something like below would work

 var x = [1,2,2,3,4,2,6]; // Source list var x2 = []; // Will hold the de-duped result x.forEach(function(elem){if(x2.indexOf(elem) === -1) x2.push(elem);}); x2; // <- [1, 2, 3, 4, 6] 

If you want to compare the properties of an object with one level, you can write something like below (maybe an easier way is to just whip it together)

 function sameValues(o1, o2){ for(p in o1){ if(o1[p] !== o2[p]) return false; } for(p in o2){ if(o2[p] !== o1[p]) return false; } return true; } var Object1 = {connectorIndex: 1, nodeID: 6, Connectors: Object}; var Object2 = {connectorIndex: 1, nodeID: 6, Connectors: Object}; var Object3 = {connectorIndex: 1, nodeID: 7, Connectors: Object}; var Object4 = {connectorIndex: 2, nodeID: 7, Connectors: Object}; var Object5 = {connectorIndex: 1, nodeID: 7, Connectors: Object}; var arr = [Object1, Object2, Object3, Object4, Object5]; var result = []; arr.forEach(function(e1){ if(!result.some(function(e2){return sameValues(e1,e2);})){ // No existing object with same top level values in target array, so add result.push(e1); } }); // result will have the 1st, 3rd, and 4th object only 
+3
source

This is how I prefer to remove duplicate objects from javascript array -

 var fieldArray = [{ "name": "tom", "text": "tasty" },{ "name": "ram", "text": "rty" },{ "name": "ram", "text": "rty" },{ "name": "shyam", "text": "tasty" },{"name": "ram", "text": "rty" },{ "name": "tom", "text": "tasty" }]; fieldArray = fieldArray.reduce(function(field, e1){ var matches = field.filter(function(e2){return e1.name== e2.name}); if (matches.length == 0){ field.push(e1); }return field; }, []); alert(JSON.stringify(fieldArray)); 

This works great for me.

+1
source

Use an array to store the items that you already have, and use a filter ()

 var keys = [] yourArray.filter(function(v) { if (keys.indexOf(v.whatIAmLookingFor) < 0) { keys.push(v.whatIAmLookingFor) return true } return false }) 

Wrap it in a function and call it day. Pass a function to the test and name it even better.

0
source

Not sure how much this artist is, but I seem to be concise for him, it works for me (its ES6, but I'm sure you could figure out a simple ol ES5):

 let dedupe = (arr, keys) => { let deduped = []; arr.forEach(i => { if (deduped.length === 0) { deduped.push(i); } else { let exists = deduped.find(x => { return keys.every(key => { return i[key] === x[key]; }); }); if (!exists) { deduped.push(i); } } }); return deduped; }; objArr = dedupe(objArr, ['key', 'test', 'foo']); 
0
source

Source: https://habr.com/ru/post/978230/


All Articles