Ich habe zwei Ergebnismengen 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 Endergebnis, das ich brauche, ist der Unterschied zwischen diesen Arrays - das Endergebnis sollte folgendermaßen aussehen:
[{ value: "4", display: "Ryan" }]
Ist es möglich, so etwas in JavaScript zu tun?
javascript
arrays
object
BKM
quelle
quelle
Antworten:
Wenn Sie nur natives JS verwenden, funktioniert so etwas:
quelle
return a.value ===...
in deiner Antwort? (Gute Lösung übrigens, +1) Abgesehen von der VerwendungArray.prototype.some()
kann ich keinen effizienteren / kürzeren Weg finden, dies zu tun.true
oderfalse
Wert) zurückgibt . In diesem Fall können wir den Begriff des Testens auf Gleichheit vom Rest des Codes trennen, indem der Benutzer die Gleichheitsprüfung als Funktion bestehen muss ein einfacher generischer Algorithmus.Sie könnten
Array.prototype.filter()
in Kombination mit verwendenArray.prototype.some()
.Hier ist ein Beispiel (vorausgesetzt, Ihre Arrays sind in den Variablen
result1
und gespeichertresult2
):quelle
Für diejenigen, die Einzeilerlösungen in ES6 mögen, so etwas:
quelle
Ich verfolge einen etwas allgemeineren Ansatz, obwohl die Ideen den Ansätzen von @Cerbrus und @Kasper Moerch ähnlich sind . Ich erstelle eine Funktion, die ein Prädikat akzeptiert, um festzustellen, ob zwei Objekte gleich sind (hier ignorieren wir die
$$hashKey
Eigenschaft, aber es kann alles sein) und gebe eine Funktion zurück, die die symmetrische Differenz zweier Listen basierend auf diesem Prädikat berechnet:Es hat einen kleinen Vorteil gegenüber Cerebrus 'Ansatz (wie auch Kasper Moerchs Ansatz), da es früh entkommt; Wenn eine Übereinstimmung gefunden wird, wird der Rest der Liste nicht überprüft. Wenn ich eine
curry
Funktion zur Hand hätte, würde ich das etwas anders machen, aber das funktioniert gut.Erläuterung
In einem Kommentar wurde um eine ausführlichere Erklärung für Anfänger gebeten. Hier ist ein Versuch.
Wir übergeben die folgende Funktion an
makeSymmDiffFunc
:Mit dieser Funktion entscheiden wir, dass zwei Objekte gleich sind. Wie alle Funktionen, die
true
oder zurückgebenfalse
, kann es als "Prädikatfunktion" bezeichnet werden, aber das ist nur Terminologie. Der Hauptpunkt ist, dassmakeSymmDiffFunc
mit einer Funktion konfiguriert wird, die zwei Objekte akzeptiert und zurückgibt,true
wenn wir sie als gleich betrachten,false
wenn wir dies nicht tun.Wenn Sie dies verwenden
makeSymmDiffFunc
(lesen Sie "Symmetrische Differenzfunktion machen"), erhalten Sie eine neue Funktion:Dies ist die Funktion, die wir tatsächlich verwenden werden. Wir übergeben ihm zwei Listen und es findet die Elemente in der ersten nicht in der zweiten, dann die in der zweiten nicht in der ersten und kombinieren diese beiden Listen.
Wenn ich noch einmal darüber nachdenke, hätte ich definitiv einen Hinweis auf Ihren Code nehmen und die Hauptfunktion ein wenig vereinfachen können, indem ich Folgendes verwendet habe
some
:complement
verwendet das Prädikat und gibt die Elemente der ersten Liste zurück, die nicht in der zweiten Liste enthalten sind. Dies ist einfacher als mein erster Durchgang mit einer separatencontains
Funktion.Schließlich wird die Hauptfunktion in einen sofort aufgerufenen Funktionsausdruck ( IIFE ) eingeschlossen, um die interne
complement
Funktion aus dem globalen Bereich herauszuhalten.Update einige Jahre später
Jetzt, da ES2015 ziemlich allgegenwärtig geworden ist, würde ich die gleiche Technik mit viel weniger Boilerplate vorschlagen:
quelle
Dadurch wird die Differenz zwischen zwei Arrays von Objekten zurückgegeben, wobei der Schlüssel
value
zum Vergleichen verwendet wird. Beachten Sie, dass zwei Dinge mit demselben Wert nicht zurückgegeben werden, da die anderen Schlüssel ignoriert werden.Dies ist ein Teil von lodash .
quelle
Sie können ein Objekt mit Schlüsseln als eindeutigen Wert für jedes Objekt im Array erstellen und dann jedes Array basierend auf dem Vorhandensein des Schlüssels im Objekt des anderen filtern. Dies reduziert die Komplexität der Operation.
ES6
ES5
quelle
Ich denke, die @ Cerbrus-Lösung ist genau richtig. Ich habe dieselbe Lösung implementiert, aber den wiederholten Code in seine eigene Funktion (DRY) extrahiert.
quelle
Ich habe diese Lösung mit Filter und einigen gefunden.
quelle
Die meisten Antworten hier sind ziemlich komplex, aber ist die Logik dahinter nicht ganz einfach?
O (n ^ 2) Komplexität.
quelle
Sie können diff a auf b und diff b auf a ausführen und dann beide Ergebnisse zusammenführen
quelle
Ich habe eine generali diff gemacht , die zwei Objekte jeglicher Art zu vergleichen , und kann eine Modifikation - Handler gist.github.com/bortunac „diff.js“ eine Ex verwenden:
also wird die Eigenschaft a geändert, b wird gelöscht, c wird geändert, d wird hinzugefügt
}}
Verwenden Sie jetzt wie
Die Konsole wird angezeigt
quelle
Der allgemeinste und einfachste Weg:
quelle
Ich bevorzuge Kartenobjekte, wenn es um große Arrays geht.
quelle
JavaScript verfügt über Karten, die eine Einfüge- und Suchzeit von O (1) bieten. Daher kann dies in O (n) gelöst werden (und nicht in O (n²) wie alle anderen Antworten). Dazu muss für jedes Objekt ein eindeutiger Grundschlüssel (String / Nummer) generiert werden. Man könnte
JSON.stringify
, aber das ist ziemlich fehleranfällig, da die Reihenfolge der Elemente die Gleichheit beeinflussen könnte:Daher würde ich ein Trennzeichen nehmen, das in keinem der Werte vorkommt, und eine Zeichenfolge manuell erstellen:
Dann wird eine Karte erstellt. Wenn ein Element bereits in der Karte vorhanden ist, wird es entfernt, andernfalls wird es hinzugefügt. Daher bleiben nur die Elemente übrig, die ungerade Zeiten enthalten (dh nur einmal). Dies funktioniert nur, wenn die Elemente in jedem Array eindeutig sind:
Code-Snippet anzeigen
quelle
Ich bin auf diese Frage gestoßen, als ich nach einer Möglichkeit gesucht habe, das erste Element in einem Array auszuwählen, das keinem der Werte in einem anderen Array entspricht, und habe es schließlich geschafft, es mit array.find () und array.filter () wie zu sortieren Dies
Wenn Sie eine aktualisierte Liste abrufen müssen, bevor Sie nach der nächstbesten Option suchen, sollte dies gut genug funktionieren :)
quelle
Wenn Sie bereit sind, externe Bibliotheken zu verwenden, können Sie _.difference in underscore.js verwenden, um dies zu erreichen. _.difference gibt die Werte aus dem Array zurück, die in den anderen Arrays nicht vorhanden sind.
quelle