Wie man den Unterschied zwischen zwei arrays von Objekten in JavaScript
Habe ich zwei Resultsets wie diese:
//Result 1
[
{ value="0", display="Jamsheer" },
{ value="1", display="Muhammed" },
{ value="2", display="Ravi" },
{ value="3", display="Ajmal" },
{ value="4", display="Ryan" }
]
//Result 2
[
{ value="0", display="Jamsheer" },
{ value="1", display="Muhammed" },
{ value="2", display="Ravi" },
{ value="3", display="Ajmal" },
]
Das endgültige Ergebnis ich brauche, ist der Unterschied zwischen diesen arrays – das endgültige Ergebnis sollte wie folgt sein:
[{ value="4", display="Ryan" }]
Ist es möglich, etwas zu tun, wie dies in JavaScript?
Also, willst du ein array aller Elemente, die nicht auftreten, in beide arrays, gefiltert durch Wert & display?
Ich möchte den Unterschied zwischen den beiden arrays. Der Wert wird anwesend sein und in einem array.
Schau mal hier: stackoverflow.com/questions/10927722/...
Es sieht aus wie das array angezeigt, wenn Sie angemeldet sind, um die firebug-Konsole...
Sorry, aber das json-Objekt ist falsch..., die Sie ändern müssen = für :
Ich möchte den Unterschied zwischen den beiden arrays. Der Wert wird anwesend sein und in einem array.
Schau mal hier: stackoverflow.com/questions/10927722/...
Es sieht aus wie das array angezeigt, wenn Sie angemeldet sind, um die firebug-Konsole...
Sorry, aber das json-Objekt ist falsch..., die Sie ändern müssen = für :
InformationsquelleAutor BKM | 2014-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie
Array.der Prototyp.filter()
in Kombination mitArray.der Prototyp.some()
.Hier ist ein Beispiel (vorausgesetzt die arrays werden in den Variablen gespeichert
result1
undresult2
):Dies ist die passende Antwort. Danke!
InformationsquelleAutor kaspermoerch
Ich etwas mehr general-purpose-Ansatz, obwohl ähnliche Ideen, um die Ansätze der beiden @Cerbrus und @Kasper Moerch. Ich erstelle eine Funktion, die nimmt ein Prädikat, um zu bestimmen, ob zwei Objekte gleich sind (hier ignorieren wir die
$$hashKey
Eigenschaft, aber es könnte alles sein) und zurück, eine Funktion, die berechnet die symmetrische Differenz von zwei Listen auf der Grundlage, dass Prädikat:Es hat einen kleinen Vorteil gegenüber Cerebrus Ansatz (wie Kasper Moerch Ansatz), es entweicht; früh, wenn es eine übereinstimmung findet, wird es nicht stören, Sie überprüfen den rest der Liste. Wenn ich ein
curry
Funktion praktisch, würde ich dies ein wenig anders, aber dies funktioniert gut.Erklärung
Einen Kommentar gebeten, für eine ausführlichere Erklärung für Anfänger. Hier ist ein Versuch.
Passieren wir die folgende Funktion, um
makeSymmDiffFunc
:Diese Funktion ist, wie wir entscheiden, dass zwei Objekte gleich sind. Wie alle Funktionen, die Rückkehr
true
oderfalse
, kann man von einem "Prädikat-Funktion", aber das ist nur Terminologie. Der wichtigste Punkt ist, dassmakeSymmDiffFunc
konfiguriert ist, mit einer Funktion akzeptiert zwei Objekte und gibttrue
wenn wir prüfen Sie gleich,false
wenn wir nicht.Mit, dass
makeSymmDiffFunc
(Lesen Sie "machen symmetrischen Differenz-Funktion") gibt uns eine neue Funktion:Dies ist die Funktion, die wir tatsächlich nutzen. Wir übergeben es zwei Listen und findet die Elemente in der ersten nicht in die zweite, dann die zweite nicht in den ersten und kombinieren Sie diese beiden Listen.
Suchen über es wieder, obwohl, ich könnte auf jeden Fall genommen haben, ein Stichwort aus Ihrem code und vereinfacht die main-Funktion ganz ein bisschen durch die Nutzung
some
:complement
verwendet das Prädikat und liefert die Elemente der ersten Liste nicht in der zweiten. Dies ist einfacher als meinen ersten Durchgang mit einem separatencontains
Funktion.Schließlich die main-Funktion ist verpackt in eine sofort invoked function expression (IIFE) zum halten der internen
complement
Funktion aus dem globalen Bereich.Update, ein paar Jahre später
Nun, dass ES2015 hat sich ziemlich gut überall, ich würde vorschlagen, die gleiche Technik, mit viel weniger boilerplate:
Hinzugefügt eine längliche Erklärung. Ich hoffe, das hilft. (Es hat mich auch erkennen eine ernsthafte clean-up, dass dieser code haben soll.)
Sehr schöne Erklärung. Danke, Scott.
Aktualisiert mit ES2015 (ES6) - code.
InformationsquelleAutor Scott Sauyet
Ich glaube, der @Cerbrus Lösung ist vor Ort auf. Ich habe implementiert die gleiche Lösung, aber extrahiert die wiederholte code in eigene Funktion (TROCKEN).
InformationsquelleAutor Michael
Wird das Ergebnis die Differenz zwischen zwei arrays von Objekten, mit der Taste
value
zu vergleichen. Beachten Sie zwei Dinge mit dem gleichen Wert wird nicht zurückgegeben, wie die anderen Tasten werden ignoriert.Dies ist ein Teil von lodash.
Super, Funktioniert perfekt.
InformationsquelleAutor Noah
Habe ich eine generalisierte diff vergleichen 2 Objekte von jeder Art und kann auf eine änderung handler
gist.github.com/bortunac "diff.js"
eine ex von mit :
also eine Eigenschaft geändert wird, wird b gelöscht wird, c geändert, d Hinzugefügt
}
nun verwenden wie
die Konsole zeigt
InformationsquelleAutor bortunac
Meisten Antworten hier sind ziemlich Komplex, aber ist nicht die Logik dahinter ganz einfach?
O(n^2) Komplexität.
InformationsquelleAutor azrahel
Wenn Sie bereit sind für die Verwendung von externen Bibliotheken, die Sie verwenden können _.Unterschied in underscore.js um dies zu erreichen. _.Unterschied gibt die Werte aus dem array, die nicht in den anderen arrays.
Dank Ross du hast mich gerettet von Kopfschmerzen. Ich war über einen Fehler zu melden, zu unterstreichen.
differenceBy
lodash.com/docs/4.17.11#differenceBy, könnte aber funktionieren.InformationsquelleAutor Mubashir Kp
Verwenden nur native JS, so etwas wie dies funktionieren wird:
JS:
return a.value ===...
Sie Ihre Antwort? (Schöne Lösung, by the way, +1) Abgesehen vonArray.prototype.some()
ist, kann ich nicht wirklich finden ein effizienter / kürzer Weg, dies zu tun.true
oderfalse
Wert.) In diesem Fall, wenn wir trennen den Begriff der Test für die Gleichheit vom rest des Codes, durch die die Nutzer übergeben werden, die Gleichheit zu überprüfen, als eine Funktion, die wir machen können, eine einfache generische Algorithmus.Könnten Sie
Array.der Prototyp.filter()
in Kombination mitArray.der Prototyp.some()
.Hier ist ein Beispiel (vorausgesetzt die arrays werden in den Variablen gespeichert
result1
undresult2
):Ich etwas mehr general-purpose-Ansatz, obwohl ähnliche Ideen, um die Ansätze der beiden @Cerbrus und @Kasper Moerch. Ich erstelle eine Funktion, die nimmt ein Prädikat, um zu bestimmen, ob zwei Objekte gleich sind (hier ignorieren wir die
$$hashKey
Eigenschaft, aber es könnte alles sein) und zurück, eine Funktion, die berechnet die symmetrische Differenz von zwei Listen auf der Grundlage, dass Prädikat:Es hat einen kleinen Vorteil gegenüber Cerebrus Ansatz (wie Kasper Moerch Ansatz), es entweicht; früh, wenn es eine übereinstimmung findet, wird es nicht stören, Sie überprüfen den rest der Liste. Wenn ich ein
curry
Funktion praktisch, würde ich dies ein wenig anders, aber dies funktioniert gut.Erklärung
Einen Kommentar gebeten, für eine ausführlichere Erklärung für Anfänger. Hier ist ein Versuch.
Passieren wir die folgende Funktion, um
makeSymmDiffFunc
:Diese Funktion ist, wie wir entscheiden, dass zwei Objekte gleich sind. Wie alle Funktionen, die Rückkehr
true
oderfalse
, kann man von einem "Prädikat-Funktion", aber das ist nur Terminologie. Der wichtigste Punkt ist, dassmakeSymmDiffFunc
konfiguriert ist, mit einer Funktion akzeptiert zwei Objekte und gibttrue
wenn wir prüfen Sie gleich,false
wenn wir nicht.Mit, dass
makeSymmDiffFunc
(Lesen Sie "machen symmetrischen Differenz-Funktion") gibt uns eine neue Funktion:Dies ist die Funktion, die wir tatsächlich nutzen. Wir übergeben es zwei Listen und findet die Elemente in der ersten nicht in die zweite, dann die zweite nicht in den ersten und kombinieren Sie diese beiden Listen.
Suchen über es wieder, obwohl, ich könnte auf jeden Fall genommen haben, ein Stichwort aus Ihrem code und vereinfacht die main-Funktion ganz ein bisschen durch die Nutzung
some
:complement
verwendet das Prädikat und liefert die Elemente der ersten Liste nicht in der zweiten. Dies ist einfacher als meinen ersten Durchgang mit einem separatencontains
Funktion.Schließlich die main-Funktion ist verpackt in eine sofort invoked function expression (IIFE) zum halten der internen
complement
Funktion aus dem globalen Bereich.Update, ein paar Jahre später
Nun, dass ES2015 hat sich ziemlich gut überall, ich würde vorschlagen, die gleiche Technik, mit viel weniger boilerplate:
Ich glaube, der @Cerbrus Lösung ist vor Ort auf. Ich habe implementiert die gleiche Lösung, aber extrahiert die wiederholte code in eigene Funktion (TROCKEN).
Wird das Ergebnis die Differenz zwischen zwei arrays von Objekten, mit der Taste
value
zu vergleichen. Beachten Sie zwei Dinge mit dem gleichen Wert wird nicht zurückgegeben, wie die anderen Tasten werden ignoriert.Dies ist ein Teil von lodash.
Können Sie erstellen ein Objekt mit Schlüssel als eindeutiger Wert für jedes Objekt im array und dann filter-array basiert auf der Existenz des Schlüssels in der anderen das Objekt. Es reduziert die Komplexität der Bedienung.
ES6
JS:
ES5
JS:
Für diejenigen, die one-liner-Lösungen in ES6, so etwas wie dieses:
JS:
Fand ich diese Lösung mit filter, und einige.
JS:
Habe ich eine generalisierte diff vergleichen 2 Objekte von jeder Art und kann auf eine änderung handler
gist.github.com/bortunac "diff.js"
eine ex von mit :
also eine Eigenschaft geändert wird, wird b gelöscht wird, c geändert, d Hinzugefügt
}
nun verwenden wie
die Konsole zeigt
Meisten Antworten hier sind ziemlich Komplex, aber ist nicht die Logik dahinter ganz einfach?
O(n^2) Komplexität.
Wenn Sie bereit sind für die Verwendung von externen Bibliotheken, die Sie verwenden können _.Unterschied in underscore.js um dies zu erreichen. _.Unterschied gibt die Werte aus dem array, die nicht in den anderen arrays.
differenceBy
lodash.com/docs/4.17.11#differenceBy, könnte aber funktionieren.