Ich habe diese zwei Arrays: eines ist mit Informationen aus einer Ajax-Anfrage gefüllt und ein anderes speichert die Schaltflächen, auf die der Benutzer klickt. Ich benutze diesen Code (ich habe mit Probennummern gefüllt):
var array1 = [2, 4];
var array2 = [4, 2]; //It cames from the user button clicks, so it might be disordered.
array1.sort(); //Sorts both Ajax and user info.
array2.sort();
if (array1==array2) {
doSomething();
}else{
doAnotherThing();
}
Aber es gibt immer false
, auch wenn die beiden Arrays gleich sind, aber mit unterschiedlichen Namen. (Ich habe dies in der JS-Konsole von Chrome überprüft.) Kann ich also auf irgendeine Weise wissen, ob diese beiden Arrays dasselbe enthalten? Warum gibt es false
? Wie kann ich wissen, welche Werte im ersten Array nicht im zweiten enthalten sind?
javascript
arrays
compare
Carlos Precioso
quelle
quelle
Antworten:
Beachten Sie, dass dies die ursprünglichen Arrays im Gegensatz zu einer vorherigen Antwort nicht ändert.
quelle
Wenn Ihre Array-Elemente keine Objekte sind - wenn es sich beispielsweise um Zahlen oder Zeichenfolgen handelt, können Sie die verknüpften Zeichenfolgen vergleichen, um festzustellen, ob sie in beliebiger Reihenfolge dieselben Mitglieder haben.
quelle
['a', 'b']
und['a,b']
. Ich würde diese Technik nur für kleine Wegwerfskripte empfehlen.Wenn Sie nur überprüfen möchten, ob zwei Arrays dieselben Werte haben (unabhängig von der Anzahl der Vorkommen und der Reihenfolge der einzelnen Werte), können Sie dies mithilfe von lodash tun :
Kurz, einfach und hübsch!
quelle
xor
in den Unterstrich-Dokumenten zu finden ? Denkst du an IODash?Vielleicht?
quelle
Warum Ihr Code nicht funktioniert hat
JavaScript hat primitive Datentypen und nicht-primitive Datentypen.
Für primitive Datentypen,
==
und===
prüfen , ob die Dinge , die auf beiden Seiten der Stäbe haben den gleichen Wert. Deshalb1 === 1
ist es wahr.Für nicht-primitive Datentypen wie Arrays
==
und===
Kontrolle Referenz Gleichheit. Das heißt, sie prüfen, obarr1
undarr2
dasselbe Objekt sind. In Ihrem Beispiel haben die beiden Arrays dieselben Objekte in derselben Reihenfolge, sind jedoch nicht gleichwertig.Lösungen
Zwei Arrays
arr1
undarr2
haben genau dann dieselben Mitglieder, wenn:arr2
ist inarr1
UND
arr1
ist inarr2
Das reicht also aus (ES2016):
Diese zweite Lösung mit Underscore entspricht eher dem, was Sie versucht haben:
Es funktioniert, weil
isEqual
nach "tiefer Gleichheit" gesucht wird, was bedeutet, dass mehr als nur Referenzgleichheit betrachtet und Werte verglichen werden.Eine Lösung für Ihre dritte Frage
Sie haben auch gefragt, wie Sie herausfinden können, in welchen Dingen
arr1
nichts enthalten istarr2
.Dies wird es tun (ES2015):
Sie können auch die
difference
folgende Methode verwenden:AKTUALISIEREN
Siehe @ Redu's Kommentar - meine Lösung ist für
sameMembers
, aber was Sie vielleicht im Sinn haben, istsameMembersInOrder
auch bekannt alsdeepEquals
.UPDATE 2
Wenn Sie sich nicht um die Reihenfolge der Mitglieder der Arrays kümmern, ist ES2015 +
Set
möglicherweise eine bessere Datenstruktur alsArray
. LesenisSuperset
difference
Sie die MDN-Hinweise zur Implementierung und Verwendung gefährlicher Affen-Patches.quelle
sameMembers([1,1,2],[2,1,2]);
false zurückgeben.sameMembers([1,1,2],[2,1,2])
solltetrue
meiner Meinung nach zurückkehren.sameMembersInOrder([1,1,2],[2,1,2])
AKAdeepEquals([1,1,2],[2,1,2])
sollte zurückkehrenfalse
.arr1.filter...
funktioniert nur, um zu überprüfen, ob arr2 alle Elemente von arr1 enthält oder nicht, aber nicht umgekehrt, was ebenfalls erforderlich ist.Objektgleichheitsprüfung:
JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())
Der obige Test funktioniert auch mit Arrays von Objekten. In diesem Fall wird eine Sortierfunktion verwendet, die unter http://www.w3schools.com/jsref/jsref_sort.asp dokumentiert ist
Könnte für kleine Arrays mit flachen JSON-Schemas ausreichen.
quelle
Unser Ziel ist es grundsätzlich zu überprüfen, ob 2 Arrays gleiche Mengen sind. set ist die mathematisch definierte Menge . Die schnellste asymptotische Sortierung benötigt O (nlog (n)) Zeit. Wenn Sie also ein Array sortieren, dauert es mindestens O (nlog (n)) . Sie können diese Aufgabe jedoch schneller erledigen , was bei einer Wörterbuchdatenstruktur asymptotisch O (n) Zeit in Anspruch nimmt (Durchschnittsfall nicht Worst Case). In JS ist ein Wörterbuch einfach ein Objekt mit Schlüsseln und Werten.
Beachten Sie, dass diese Funktion mit Arrays primitiver Typen funktioniert
a1
unda2
Arrays annimmt und sind.quelle
Was ist damit? ES 2017 nehme ich an:
Die erste Bedingung prüft, ob beide Arrays dieselbe Länge haben, und die zweite Bedingung prüft, ob das erste Array eine Teilmenge des zweiten Arrays ist. Die Kombination dieser beiden Bedingungen sollte dann zu einem Vergleich aller Elemente der beiden Arrays führen, unabhängig von der Reihenfolge der Elemente.
Der obige Code funktioniert nur, wenn beide Arrays nicht doppelte Elemente enthalten.
quelle
Wenn Sie diese beiden Arrays vergleichen, vergleichen Sie die Objekte, die die Arrays darstellen, nicht den Inhalt.
Sie müssen eine Funktion verwenden, um die beiden zu vergleichen. Sie können Ihre eigene schreiben, die einfach eine Schleife durchläuft und diese mit der anderen vergleicht, nachdem Sie überprüft haben, ob die Längen gleich sind.
quelle
Einfache Lösung für flache Gleichstellung mit ES6:
Erstellt flache Kopien jedes Arrays und sortiert sie. Verwendet dann
some()
eine Schleife durcharr1test
Werte und vergleicht jeden Wert mit dem Wert inarr2test
mit demselben Index. Sind alle Werte gleich sind,some()
kehrtfalse
, und wiederumequal
ausgewertettrue
.Könnte auch verwendet werden
every()
, müsste aber jedes Element im Array durchlaufen, um eintrue
Ergebnis zu erzielen , währendsome()
es sich retten wird, sobald es einen Wert findet, der nicht gleich ist:quelle
Ich hatte einfache ganzzahlige Werte in einem Spielprojekt.
Hatte weniger Werte in jedem Array. Außerdem brauchte
ich das ursprüngliche Array unberührt. Also habe ich das Folgende getan, es hat gut funktioniert. (Code bearbeitet, um hier einzufügen)
Hoffentlich hilft das.
quelle
Verwenden von ES6
Wir werden Ramdas
equals
Funktion verwenden, aber stattdessen können wir die von Lodash oder Underscore verwendenisEqual
:Mit dem Spread-Opporator vermeiden wir die Mutation der ursprünglichen Arrays und halten unsere Funktion rein.
quelle
Sie können
reduce
anstelle von Loops verwenden, um clever zu wirken, aber auf die Gefahr hin, dass Ihre Kollegen Sie als Smart-Ass betrachten.quelle
Wenn die Elemente im Array Grundelemente (Zahlen oder einzelne Zeichen) sind, können Sie eine Kombination aus Längenvergleich und Verwendung von Mengen verwenden.
quelle
Es ist bereits 2020, aber ich habe festgestellt, dass die meisten anderen Lösungen sort, O (n * log n), Bibliotheken oder O (n ^ 2) -Komplexität verwenden.
Hier ist eine reine Javascript-Lösung mit linearer Komplexität, O (n):
Tests:
quelle
Wenn Sie das Prototype Framework verwenden, können Sie die intersect- Methode eines Arrays verwenden, um herauszufinden, ob sie identisch sind (unabhängig von der Reihenfolge):
quelle
[1,2].intersect([1,2,3]).length === [1,2].length
gibt true zurück. Sie sollten auch die Länge der ursprünglichen Arrays vergleichen. Ich habe den Beitrag bearbeitet, um dies zu demonstrieren.array1 = [1,1,2]; array2 = [1,1,2];
... die ursprüngliche Antwort schlägt für diese Eingabe nicht fehl._.difference(array1, array2).length;
Bitte überprüfen Sie diese Antwort
quelle
return
sonst hat dies keine Auswirkung. Zweitens sollten Sie die sortierten Arrays überprüfen, wie[1,2]
und[2,1]
wird als nicht derselben erkannt werden. Drittens und vor allem wird dabei nur geprüft, ob ein Element dasselbe ist. Die Bedingung sollte seinif (array1!==array2) {return false;}
. Vielleicht kann Ihnen das in Zukunft helfen!array1
undarray2
könnte umbenannt werdenelem1
undelem2
. Beide Tipps ersparen Ihnen in Zukunft viele Kopfschmerzen!Antworten Sie nach langer Zeit, aber hoffen Sie, dass dies jemandem hilft, der nach einer einfachen Lösung und modernen Neulingen sucht.
Jetzt können wir diese mit mehreren Bibliotheken wie erreichen
lodash
,underscore
etc. (dieser Teil des Projektes heute aufgrund der Einfachheit, mehr Funktionen und hoher Nutzung wird)Sie können die Kreuzung aus der Lodash-Bibliothek verwenden.
Dies funktioniert für jeden Datentyp.
quelle
Wenn Sie zwei Arrays vergleichen und prüfen möchten, ob ein Objekt in beiden Arrays identisch ist, funktioniert dies. Beispiel:
Array1 = [a, b, c, d]
Array2 = [d, e, f, g]
Hier ist 'd' in beiden Arrays gleich, sodass diese Funktion den wahren Wert zurückgibt.
quelle
Versuche dies
quelle
Ich habe einen anderen Weg basierend auf der akzeptierten Antwort.
quelle
Eine Funktion zum Vergleichen von zwei Arrays, um zu überprüfen, ob beide dieselben Elemente haben. Auch wenn sie nicht in Ordnung sind ...
Es ist gut für einfache Arrays. [String, Number, Boolean, null, NaN].
Ich verwende nicht .sort (), es ändert das ursprüngliche Array. Einige sagen, es ist schlecht ...
Vorsicht. Diese Funktion ist eingeschränkt und kann keine Objekte "[], {}" oder Funktionen in diesen Arrays vergleichen. Arrays selbst sind Objekte.
quelle
Einfache Lösung zum Vergleichen der beiden Arrays:
quelle