953 Stimmen

Wie entfernt man alle Duplikate aus einem Array von Objekten?

Ich habe ein Objekt, das ein Array von Objekten enthält.

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"});

Ich frage mich, was ist die beste Methode zum Entfernen von doppelten Objekten aus einem Array. Also zum Beispiel, obj.arr werden würde...

{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}

159voto

ambodi Punkte 5792

Wenn Sie Javascript-Bibliotheken verwenden können, wie z.B. Unterstrich oder lodash, empfehle ich einen Blick auf _.uniq Funktion in ihren Bibliotheken. Von lodash :

_.uniq(array, [isSorted=false], [callback=_.identity], [thisArg])

Im Grunde übergeben Sie das Array, das hier ein Objektliteral ist, und das Attribut, mit dem Sie Duplikate im ursprünglichen Datenarray entfernen möchten, etwa so:

var data = [{'name': 'Amir', 'surname': 'Rahnama'}, {'name': 'Amir', 'surname': 'Stevens'}];
var non_duplidated_data = _.uniq(data, 'name'); 

UPDATE : Lodash hat jetzt eine .uniqBy auch.

99voto

James Drinkard Punkte 14572

Ich hatte genau die gleiche Anforderung, um doppelte Objekte in einem Array zu entfernen, basierend auf Duplikaten in einem einzelnen Feld. Ich fand den Code hier: Javascript: Duplikate aus Array von Objekten entfernen

In meinem Beispiel entferne ich also jedes Objekt aus dem Array, das einen doppelten licenseNum-Stringwert hat.

var arrayWithDuplicates = [
    {"type":"LICENSE", "licenseNum": "12345", state:"NV"},
    {"type":"LICENSE", "licenseNum": "A7846", state:"CA"},
    {"type":"LICENSE", "licenseNum": "12345", state:"OR"},
    {"type":"LICENSE", "licenseNum": "10849", state:"CA"},
    {"type":"LICENSE", "licenseNum": "B7037", state:"WA"},
    {"type":"LICENSE", "licenseNum": "12345", state:"NM"}
];

function removeDuplicates(originalArray, prop) {
     var newArray = [];
     var lookupObject  = {};

     for(var i in originalArray) {
        lookupObject[originalArray[i][prop]] = originalArray[i];
     }

     for(i in lookupObject) {
         newArray.push(lookupObject[i]);
     }
      return newArray;
 }

var uniqueArray = removeDuplicates(arrayWithDuplicates, "licenseNum");
console.log("uniqueArray is: " + JSON.stringify(uniqueArray));

Die Ergebnisse:

uniqueArray ist:

[{"type":"LICENSE","licenseNum":"10849","state":"CA"},
{"type":"LICENSE","licenseNum":"12345","state":"NM"},
{"type":"LICENSE","licenseNum":"A7846","state":"CA"},
{"type":"LICENSE","licenseNum":"B7037","state":"WA"}]

73voto

Mμ. Punkte 7814

Einzeiler mit Set

var things = new Object();

things.thing = new Array();

things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});

// assign things.thing to myData for brevity
var myData = things.thing;

things.thing = Array.from(new Set(myData.map(JSON.stringify))).map(JSON.parse);

console.log(things.thing)

Erläuterung:

  1. new Set(myData.map(JSON.stringify)) erstellt eine Satz Objekt unter Verwendung der stringifizierten myData-Elemente.
  2. Set-Objekt wird sicherstellen, dass jedes Element eindeutig ist.
  3. Dann erstelle ich ein Array auf der Grundlage der Elemente der erstellten Menge mit Array.from.
  4. Zum Schluss verwende ich JSON.parse, um das stringifizierte Element wieder in ein Objekt zu konvertieren.

62voto

sravan ganji Punkte 3939

ES6 One-Liner ist hier

let arr = [
  {id:1,name:"sravan ganji"},
  {id:2,name:"pinky"},
  {id:4,name:"mammu"},
  {id:3,name:"avy"},
  {id:3,name:"rashni"},
];

console.log(Object.values(arr.reduce((acc,cur)=>Object.assign(acc,{[cur.id]:cur}),{})))

47voto

аlex dykyі Punkte 4889

Der einfachste Weg ist die Verwendung von filter :

var uniq = {};
var arr  = [{"id":"1"},{"id":"1"},{"id":"2"}];
var arrFiltered = arr.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));
console.log('arrFiltered', arrFiltered);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X