Schauen Sie sich dieses Codebeispiel an oder gehen Sie zur jsfiddle

function printRelation(a, b, out) {
    var text;
    if (a === b) {
        text = "a === b";
    } else if (a == b) {
        text = "a == b";
    } else {
        text = "a != b";
    }
    $('#' + out).text(text);
}

var a = [0, 0, 2], b = a;
printRelation(a, b, 'out1');
a = [0, 0, 2];
b = [0, 0, 2];
printRelation(a, b, 'out2');

Ich hätte erwartet, dass beide Tests a === b ausgeben, aber nur der erste. Der zweite gibt a != b aus. Kann jemand dieses Verhalten erklären? Wie kann ich Arrays in Javascript effizient vergleichen?

10
Shawn 7 Okt. 2012 im 19:59

4 Antworten

Beste Antwort

JavaScript-Array-Vergleiche, wie Sie sie geschrieben haben, sind nur einfache Objektreferenzvergleiche. Sie sind keine "tiefen" Vergleiche Element für Element.

Sie können Ihre eigene Vergleichsfunktion schreiben, um zu überprüfen, ob die Längen und Elemente gleich sind, entweder in der Reihenfolge oder nicht, je nach Ihren Anforderungen. edit Wie andere betonen, gibt es mehrere Bibliotheken, die Array-Vergleichsfunktionen enthalten. Wenn Sie eine finden, die Ihrer Definition von "Gleichheit" entspricht (nicht unwahrscheinlich), und es Ihnen nichts ausmacht, diese Bibliothek in Ihre Architektur zu integrieren, ist dies möglicherweise eine gute Idee.

2
Pointy 7 Okt. 2012 im 16:26

Arrays sind Objekte in Javascript. Das Vergleichen von Objekten kann nicht mit == durchgeführt werden, wie Sie es normalerweise beim Vergleichen von Zeichenfolgen oder Zahlen verwenden würden.

Es gibt viele andere Möglichkeiten, Arrays zu vergleichen. Mein Favorit ist die Verwendung von JSON:

if ( JSON.stringify(a) == JSON.stringify(b) ) {
    // equal

Beachten Sie, dass das Zuweisen eines bereits vorhandenen Objekts zu einer Variablen wie beim Schreiben von b = a nur das Kopieren einer Referenz ist. Sie zeigen beide auf dasselbe Array.

Sie müssten b = a.slice() ausführen, um eine echte Kopie zu erhalten.

7
David Hellsing 7 Okt. 2012 im 16:12

Sie können die isEqual-Methode der Underscore.js-Bibliothek verwenden.

http://underscorejs.org/#isEqual

Führt einen optimierten Tiefenvergleich zwischen den beiden Objekten durch, um festzustellen, ob sie als gleich angesehen werden sollten.

var moe   = {name : 'moe', luckyNumbers : [13, 27, 34]};
var clone = {name : 'moe', luckyNumbers : [13, 27, 34]};
moe == clone;
=> false
_.isEqual(moe, clone);
=> true

AKTUALISIEREN

Lodash ist vom Unterstrich inspiriert, aber heutzutage ist es eine überlegene Lösung

https://lodash.com/docs/#isEqual

Führt einen optimierten Tiefenvergleich zwischen den beiden Objekten durch, um festzustellen, ob sie als gleich angesehen werden sollten.

var object = { 'a': 1 };
var other = { 'a': 1 };

_.isEqual(object, other);
// => true

object === other;
// => false
25
RKumsher 18 Okt. 2016 im 19:03

Verwenden Sie lodash.

_.isEqual([1,2],[1,2])

Funktioniert auch mit Objekten.

_.isEqual({a:1}, {a:1})
12
Stefan Kendall 18 Sept. 2015 im 22:43