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

17voto

Justin Punkte 4082

Unter Berücksichtigung von lodash.uniqWith

const objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];

_.uniqWith(objects, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]

16voto

Pete B Punkte 1639

Um der Liste einen weiteren hinzuzufügen. Die Verwendung von ES6 und Array.reduce con Array.find .
In diesem Beispiel wird das Filtern von Objekten basierend auf einem guid Eigentum.

let filtered = array.reduce((accumulator, current) => {
  if (! accumulator.find(({guid}) => guid === current.guid)) {
    accumulator.push(current);
  }
  return accumulator;
}, []);

Erweitern Sie diese, um die Auswahl einer Eigenschaft zu ermöglichen und sie in einen Einzeiler zu komprimieren:

const uniqify = (array, key) => array.reduce((prev, curr) => prev.find(a => a[key] === curr[key]) ? prev : prev.push(curr) && prev, []);

Um es zu verwenden, übergeben Sie ein Array von Objekten und den Namen des Schlüssels, den Sie de-dupe auf einen String-Wert:

const result = uniqify(myArrayOfObjects, 'guid')

15voto

Eine TypeScript-Lösung

Dadurch werden doppelte Objekte entfernt und die Typen der Objekte bleiben erhalten.

function removeDuplicateObjects(array: any[]) {
  return [...new Set(array.map(s => JSON.stringify(s)))]
    .map(s => JSON.parse(s));
}

15voto

Cliff Hall Punkte 673

Verdammt, Kinder, lasst uns das Ding doch zerquetschen, oder?

let uniqIds = {}, source = [{id:'a'},{id:'b'},{id:'c'},{id:'b'},{id:'a'},{id:'d'}];
let filtered = source.filter(obj => !uniqIds[obj.id] && (uniqIds[obj.id] = true));
console.log(filtered);
// EXPECTED: [{id:'a'},{id:'b'},{id:'c'},{id:'d'}];

15voto

Savan Akbari Punkte 430
let myData = [{place:"here",name:"stuff"}, 
 {place:"there",name:"morestuff"},
 {place:"there",name:"morestuff"}];

let q = [...new Map(myData.map(obj => [JSON.stringify(obj), obj])).values()];

console.log(q)

Einzeiler mit ES6 und new Map() .

// assign things.thing to myData
let myData = things.thing;

[...new Map(myData.map(obj => [JSON.stringify(obj), obj])).values()];

Einzelheiten:-

  1. Tun .map() auf der Datenliste und die Umwandlung jedes einzelnen Objekts in eine [key, value] pair array(length =2) wäre das erste Element (key) die stringified Version des Objekts und second(value) wäre eine object selbst.
  2. Hinzufügen der oben erstellten Array-Liste zu new Map() hätte den Schlüssel als stringified Objekt und jede Hinzufügung desselben Schlüssels würde dazu führen, dass der bereits vorhandene Schlüssel überschrieben wird.
  3. Verwendung von .values() würde MapIterator mit allen Werten in einer Map ( obj in unserem Fall)
  4. Endlich, spread ... Operator, um ein neues Array mit den Werten aus dem obigen Schritt zu erstellen.

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