Ich habe ein Objekt, das ein Array von Objekten enthält.
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"});
Ich frage mich, was die beste Methode ist, um doppelte Objekte aus einem Array zu entfernen. So würde zum Beispiel alles ... alles werden ...
{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}
javascript
arrays
object
duplicates
Travis
quelle
quelle
aaaaa.aaaa.push(...)
:)Antworten:
Eine primitive Methode wäre:
quelle
Wie wäre es mit etwas
es6
Magie?Referenz-URL
Eine allgemeinere Lösung wäre:
Stackblitz Beispiel
quelle
things.thing = things.thing.filter((thing, index, self) => self.findIndex(t => t.place === thing.place && t.name === thing.name) === index)
const uniqueArray = arrayOfObjects.filter((object,index) => index === arrayOfObjects.findIndex(obj => JSON.stringify(obj) === JSON.stringify(object)));
jsfiddle.net/x9ku0p7L/28Wenn Sie Javascript-Bibliotheken wie Unterstrich oder lodash verwenden können, empfehle ich, sich die
_.uniq
Funktion in ihren Bibliotheken anzusehen . Vonlodash
:Grundsätzlich übergeben Sie das Array, das hier ein Objektliteral ist, und Sie übergeben das Attribut, mit dem Sie Duplikate im ursprünglichen Datenarray entfernen möchten, wie folgt:
UPDATE : Lodash hat jetzt auch eine eingeführt
.uniqBy
.quelle
uniqBy
anstelle vonuniq
zB_.uniqBy(data, 'name')
... Dokumentation verwenden: lodash.com/docs#uniqByIch hatte genau die gleiche Anforderung, doppelte Objekte in einem Array zu entfernen, basierend auf doppelten Objekten in einem einzelnen Feld. Ich habe den Code hier gefunden: Javascript: Duplikate aus dem Array von Objekten entfernen
In meinem Beispiel entferne ich also jedes Objekt aus dem Array, das einen doppelten Lizenznum-Zeichenfolgenwert hat.
Die Ergebnisse:
uniqueArray ist:
quelle
for(var i in array) { if(array[i][prop]){ //valid lookupObject[array[i][prop]] = array[i]; } else { console.log('falsy object'); } }
for (let i in originalArray) { if (lookupObject[originalArray[i]['id']] === undefined) { newArray.push(originalArray[i]); } lookupObject[originalArray[i]['id']] = originalArray[i]; }
Kürzeste Einzeiler für ES6 +
Finden Sie eindeutige
id
Werte in einem Array.Einzigartig durch mehrere Eigenschaften (
place
undname
)Einzigartig für alle Eigenschaften (Dies ist bei großen Arrays langsam)
Behalten Sie das letzte Vorkommen.
quelle
Ein Liner mit Set
Erläuterung:
new Set(myData.map(JSON.stringify))
erstellt eine Erstellt Set- Objekt mit den stringifizierten myData-Elementen.quelle
Mit ES6 + in einer einzelnen Zeile erhalten Sie eine eindeutige Liste von Objekten nach Schlüssel:
Es kann in eine Funktion eingefügt werden:
Hier ist ein Arbeitsbeispiel:
Wie funktioniert es
Zunächst wird das Array so neu zugeordnet, dass es als Eingabe für eine Karte verwendet werden kann.
Dies bedeutet, dass jedes Element des Arrays in ein anderes Array mit 2 Elementen umgewandelt wird. Der ausgewählte Schlüssel als erstes Element und das gesamte Anfangselement als zweites Element wird als Eintrag bezeichnet (z. B. Array-Einträge , Karteneinträge ). Und hier ist das offizielle Dokument mit einem Beispiel, das zeigt, wie Array-Einträge im Map-Konstruktor hinzugefügt werden.
Beispiel , wenn der Schlüssel ist Platz :
Zweitens übergeben wir dieses modifizierte Array an den Map-Konstruktor und hier geschieht die Magie. Map entfernt die doppelten Schlüsselwerte und behält nur den zuletzt eingefügten Wert desselben Schlüssels bei. Hinweis : Die Karte behält die Einfügereihenfolge bei. ( Unterschied zwischen Karte und Objekt prüfen )
Drittens verwenden wir die Kartenwerte, um die Originalelemente abzurufen, diesmal jedoch ohne Duplikate.
Und das letzte ist, diese Werte zu einem neuen Array hinzuzufügen, damit es als ursprüngliche Struktur aussehen und Folgendes zurückgeben kann:
quelle
id
. Die Frage erfordert, dass das gesamte Objekt in allen Bereichen wieplace
undname
Hier ist eine weitere Option, um Array-Iterationsmethoden zu verwenden, wenn Sie nur einen Vergleich mit einem Feld eines Objekts benötigen:
quelle
Ein Liner ist hier
quelle
Wenn Sie warten können, bis die Duplikate entfernt sind, bis alle Ergänzungen abgeschlossen sind, besteht der typische Ansatz darin, zuerst das Array zu sortieren und dann die Duplikate zu entfernen. Die Sortierung vermeidet den N * N-Ansatz, das Array nach jedem Element zu durchsuchen, während Sie durch es gehen.
Die Funktion "Duplikate entfernen " wird normalerweise als eindeutig oder eindeutig bezeichnet . Einige vorhandene Implementierungen können die beiden Schritte kombinieren, z. B. die Uniq des Prototyps
Dieser Beitrag enthält einige Ideen, die Sie ausprobieren sollten (und einige, die Sie vermeiden sollten :-)), falls Ihre Bibliothek noch keine hat ! Persönlich finde ich das am einfachsten:
quelle
function(_a,_b){return _a.a===_b.a && _a.b===_b.b;}
das Array nicht sortiert wird, wenn Ihre Vergleichsfunktion aktiviert ist .Der einfachste Weg ist die Verwendung
filter
:quelle
id
. Die Frage erfordert, dass das gesamte Objekt in allen Bereichen wieplace
undname
Dies ist eine generische Methode: Sie übergeben eine Funktion, die prüft, ob zwei Elemente eines Arrays als gleich angesehen werden. In diesem Fall werden die Werte von
name
und verglichenplace
Eigenschaften der beiden verglichenen Objekte verglichen.ES5 Antwort
Ursprüngliche ES3-Antwort
quelle
Hinzufügen eines weiteren zur Liste. Mit ES6 und
Array.reduce
mitArray.find
.In diesem Beispiel werden Objekte basierend auf einer
guid
Eigenschaft gefiltert.Erweitern Sie diese, um die Auswahl einer Eigenschaft zu ermöglichen und sie zu einem Einzeiler zu komprimieren:
Um es zu verwenden, übergeben Sie ein Array von Objekten und den Namen des Schlüssels, den Sie als Zeichenfolgenwert entfernen möchten:
quelle
Sie können auch Folgendes verwenden
Map
:Vollständige Probe:
Ergebnis:
quelle
Verdammt, Kinder, lasst uns dieses Ding zerquetschen, warum nicht wir?
quelle
id
. Die Frage erfordert, dass das gesamte Objekt in allen Bereichen wieplace
undname
place
undname
heute. Jeder, der diesen Thread liest, sucht nach einer optimalen Methode, um eine Liste von Objekten zu erstellen, und dies ist eine kompakte Methode, um dies zu tun.Eine TypeScript-Lösung
Dadurch werden doppelte Objekte entfernt und die Objekttypen werden beibehalten.
quelle
In Anbetracht
lodash.uniqWith
quelle
Eine andere Option wäre, eine benutzerdefinierte indexOf-Funktion zu erstellen, die die Werte der von Ihnen ausgewählten Eigenschaft für jedes Objekt vergleicht und diese in eine Reduzierungsfunktion einschließt.
quelle
lodash.isequal
npm-Paket als leichtgewichtigen Objektkomparator kombiniert, um eine einzigartige Array-Filterung durchzuführen ... z. B. ein bestimmtes Array von Objekten. Einfach eingetauscht,if (_.isEqual(a[i], b)) {
anstatt nach einer einzelnen Immobilie zu suchenEinzeiler mit ES6 und
new Map()
.Einzelheiten:-
.map()
die Datenliste bearbeiten und jedes einzelne Objekt in ein[key, value]
Paararray (Länge = 2) konvertieren , ist das erste Element (Schlüssel) diestringified
Version des Objekts und das zweite (Wert) eineobject
Selbst.new Map()
würde den Schlüssel als habenstringified
Objekt haben, und das derselben Schlüssel würde dazu führen, dass der bereits vorhandene Schlüssel überschrieben wird..values()
würde MapIterator mit allen Werten in einer Map geben (obj
in unserem Fall)spread ...
Operator, um neues Array mit Werten aus dem obigen Schritt zu geben.quelle
Hier ist eine Lösung für es6, bei der Sie nur das letzte Element behalten möchten. Diese Lösung ist funktional und Airbnb-konform.
quelle
removeDuplicates () nimmt ein Array von Objekten auf und gibt ein neues Array ohne doppelte Objekte zurück (basierend auf der id-Eigenschaft).
Erwartetes Ergebnis:
Zuerst setzen wir den Wert der Variablen uniq auf ein leeres Objekt.
Als nächstes filtern wir durch das Array von Objekten. Filter erstellt ein neues Array mit allen Elementen, die den von der bereitgestellten Funktion implementierten Test bestehen.
Oben verwenden wir die Kurzschlussfunktion von &&. Wenn die linke Seite des && als wahr ausgewertet wird, wird der Wert rechts vom && zurückgegeben. Wenn die linke Seite falsch ist, wird zurückgegeben, was sich auf der linken Seite des && befindet.
Für jedes Objekt (obj) überprüfen wir uniq auf eine Eigenschaft mit dem Namen obj.id (In diesem Fall wird bei der ersten Iteration nach der Eigenschaft '1' gesucht.) Wir möchten das Gegenteil von dem, was es zurückgibt (entweder true) oder falsch) weshalb wir das! in! uniq [obj.id]. Wenn uniq bereits über die Eigenschaft id verfügt, wird true zurückgegeben, was zu false (!) Wertet und der Filterfunktion mitteilt, dass dieses Objekt NICHT hinzugefügt werden soll. Wenn die Eigenschaft obj.id jedoch nicht gefunden wird, wird false zurückgegeben, was dann als true (!) Auswertet und alles rechts von && oder (uniq [obj.id] = true) zurückgibt. Dies ist ein wahrheitsgemäßer Wert, der die Filtermethode anweist, dieses Objekt zum zurückgegebenen Array hinzuzufügen, und die Eigenschaft {1: true} zu uniq hinzufügt. Dadurch wird sichergestellt, dass keine andere Objektinstanz mit derselben ID erneut hinzugefügt wird.
quelle
quelle
Ich glaube eine Kombination von
reduce
mitJSON.stringify
, um Objekte perfekt und selektiv zu vergleichen das Hinzufügen diejenigen , die nicht bereits im Speicher sind , ist eine elegante Art und Weise.Beachten Sie, dass dies
JSON.stringify
in extremen Fällen, in denen das Array viele Objekte enthält und diese komplex sind, zu einem Leistungsproblem werden kann, ABER für die meiste Zeit ist dies meiner Meinung nach der kürzeste Weg.Eine andere Art, dasselbe zu schreiben (aber weniger effizient):
quelle
Weitere Erkundung der ES6-Möglichkeiten zum Entfernen von Duplikaten aus einem Array von Objekten: Das Setzen des
thisArg
Arguments vonArray.prototype.filter
tonew Set
bietet eine anständige Alternative:Es funktioniert jedoch nicht mit Pfeilfunktionen
() =>
, da diesthis
an deren lexikalischen Umfang gebunden ist.quelle
es6 Magie in einer Zeile ... lesbar dabei!
quelle
Einfache Lösung mit ES6-Hilfsmethoden zum Reduzieren und Suchen von Arrays
Funktioniert effizient und einwandfrei!
quelle
Wenn es Ihnen nichts ausmacht, dass Ihr eindeutiges Array anschließend sortiert wird, ist dies eine effiziente Lösung:
Auf diese Weise müssen Sie nur das aktuelle Element mit dem vorherigen Element im Array vergleichen. Das einmalige Sortieren vor dem Filtern (
O(n*log(n))
) ist billiger als das Suchen nach einem Duplikat im gesamten Array für jedes Array-Element (O(n²)
).quelle
Dies ist eine einfache Methode, um Doppelspurigkeiten aus einem Array von Objekten zu entfernen.
Ich arbeite viel mit Daten und das ist nützlich für mich.
wird in die Konsole drucken:
quelle
str ist ein Array von Objekten. Es gibt Objekte mit demselben Wert (hier ein kleines Beispiel, es gibt zwei Objekte mit derselben item_id wie 2). check (id) ist eine Funktion, die prüft, ob ein Objekt mit derselben item_id vorhanden ist oder nicht. Wenn es existiert, geben Sie false zurück, andernfalls true. Schieben Sie das Objekt entsprechend diesem Ergebnis in ein neues Array obj. Die Ausgabe des obigen Codes lautet
[{"item_id":1},{"item_id":2}]
quelle
Haben Sie von der Lodash-Bibliothek gehört? Ich empfehle Ihnen dieses Dienstprogramm, wenn Sie Ihre Logik nicht wirklich auf den Code anwenden möchten und bereits vorhandenen Code verwenden möchten, der optimiert und zuverlässig ist.
Erwägen Sie, ein Array wie dieses zu erstellen
Beachten Sie, dass Sie, wenn Sie ein Attribut eindeutig halten möchten, dies möglicherweise mithilfe der lodash-Bibliothek tun können. Hier können Sie _.uniqBy verwenden
Diese Methode ist wie _.uniq (die eine Version eines Arrays zurückgibt, in der nur das erste Vorkommen jedes Elements beibehalten wird), außer dass sie Iteratee akzeptiert, die für jedes Element im Array aufgerufen werden, um das Kriterium zu generieren, nach dem Die Eindeutigkeit wird berechnet.
Wenn Sie beispielsweise ein Array mit dem eindeutigen Attribut "Ort" zurückgeben möchten
Ebenso, wenn Sie ein eindeutiges Attribut als "Name" möchten
Hoffe das hilft.
Prost!
quelle