Wie vergleiche ich Arrays in JavaScript?

Julian H. Lam:

Ich möchte zwei Arrays vergleichen ... idealerweise effizient. Nichts Besonderes, nur truewenn sie identisch sind und falsewenn nicht. Es überrascht nicht, dass der Vergleichsoperator nicht zu funktionieren scheint.

var a1 = [1,2,3];
var a2 = [1,2,3];
console.log(a1==a2);    // Returns false
console.log(JSON.stringify(a1)==JSON.stringify(a2));    // Returns true

JSON-Codierung für jedes Array funktioniert, aber gibt es eine schnellere oder "bessere" Möglichkeit, Arrays einfach zu vergleichen, ohne jeden Wert durchlaufen zu müssen?

Tomas Zato - Monica wieder einsetzen:

Um Arrays zu vergleichen, durchlaufen Sie sie und vergleichen Sie jeden Wert:

Arrays vergleichen:

// Warn if overriding existing method
if(Array.prototype.equals)
    console.warn("Overriding existing Array.prototype.equals. Possible causes: New API defines the method, there's a framework conflict or you've got double inclusions in your code.");
// attach the .equals method to Array's prototype to call it on any array
Array.prototype.equals = function (array) {
    // if the other array is a falsy value, return
    if (!array)
        return false;

    // compare lengths - can save a lot of time 
    if (this.length != array.length)
        return false;

    for (var i = 0, l=this.length; i < l; i++) {
        // Check if we have nested arrays
        if (this[i] instanceof Array && array[i] instanceof Array) {
            // recurse into the nested arrays
            if (!this[i].equals(array[i]))
                return false;       
        }           
        else if (this[i] != array[i]) { 
            // Warning - two different object instances will never be equal: {x:20} != {x:20}
            return false;   
        }           
    }       
    return true;
}
// Hide method from for-in loops
Object.defineProperty(Array.prototype, "equals", {enumerable: false});

Verwendung:

[1, 2, [3, 4]].equals([1, 2, [3, 2]]) === false;
[1, "2,3"].equals([1, 2, 3]) === false;
[1, 2, [3, 4]].equals([1, 2, [3, 4]]) === true;
[1, 2, 1, 2].equals([1, 2, 1, 2]) === true;

Sie können sagen " Aber es ist viel schneller, Strings zu vergleichen - keine Schleifen ... " Nun, dann sollten Sie beachten, dass es ARE-Schleifen gibt. Erste rekursive Schleife, die Array in Zeichenfolge konvertiert, und zweite, die zwei Zeichenfolgen vergleicht. Diese Methode ist also schneller als die Verwendung von Zeichenfolgen .

Ich glaube, dass größere Datenmengen immer in Arrays gespeichert werden sollten, nicht in Objekten. Wenn Sie jedoch Objekte verwenden, können diese auch teilweise verglichen werden.
Hier ist wie:

Objekte vergleichen:

Ich habe bereits erwähnt, dass zwei Objektinstanzen werden nie gleich sein, auch wenn sie dieselben Daten zur Zeit enthalten:

({a:1, foo:"bar", numberOfTheBeast: 666}) == ({a:1, foo:"bar", numberOfTheBeast: 666})  //false

Dies hat einen Grund, da es beispielsweise private Variablen innerhalb von Objekten geben kann.

Wenn Sie jedoch nur die Objektstruktur verwenden, um Daten zu enthalten, ist ein Vergleich weiterhin möglich:

Object.prototype.equals = function(object2) {
    //For the first loop, we only check for types
    for (propName in this) {
        //Check for inherited methods and properties - like .equals itself
        //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
        //Return false if the return value is different
        if (this.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) {
            return false;
        }
        //Check instance type
        else if (typeof this[propName] != typeof object2[propName]) {
            //Different types => not equal
            return false;
        }
    }
    //Now a deeper check using other objects property names
    for(propName in object2) {
        //We must check instances anyway, there may be a property that only exists in object2
            //I wonder, if remembering the checked values from the first loop would be faster or not 
        if (this.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) {
            return false;
        }
        else if (typeof this[propName] != typeof object2[propName]) {
            return false;
        }
        //If the property is inherited, do not check any more (it must be equa if both objects inherit it)
        if(!this.hasOwnProperty(propName))
          continue;
        
        //Now the detail check and recursion
        
        //This returns the script back to the array comparing
        /**REQUIRES Array.equals**/
        if (this[propName] instanceof Array && object2[propName] instanceof Array) {
                   // recurse into the nested arrays
           if (!this[propName].equals(object2[propName]))
                        return false;
        }
        else if (this[propName] instanceof Object && object2[propName] instanceof Object) {
                   // recurse into another objects
                   //console.log("Recursing to compare ", this[propName],"with",object2[propName], " both named \""+propName+"\"");
           if (!this[propName].equals(object2[propName]))
                        return false;
        }
        //Normal value comparison for strings and numbers
        else if(this[propName] != object2[propName]) {
           return false;
        }
    }
    //If everything passed, let's say YES
    return true;
}  

Denken Sie jedoch daran, dass dies dazu dient, JSON-ähnliche Daten zu vergleichen, nicht Klasseninstanzen und andere Dinge. Wenn Sie mehr komplizierte Objekte vergleichen möchten, schauen Sie sich diese Antwort und ihre überlange Funktion an .
Damit dies funktioniert Array.equals, müssen Sie die ursprüngliche Funktion ein wenig bearbeiten:

...
    // Check if we have nested arrays
    if (this[i] instanceof Array && array[i] instanceof Array) {
        // recurse into the nested arrays
        if (!this[i].equals(array[i]))
            return false;
    }
    /**REQUIRES OBJECT COMPARE**/
    else if (this[i] instanceof Object && array[i] instanceof Object) {
        // recurse into another objects
        //console.log("Recursing to compare ", this[propName],"with",object2[propName], " both named \""+propName+"\"");
        if (!this[i].equals(array[i]))
            return false;
        }
    else if (this[i] != array[i]) {
...

Ich habe ein kleines Testwerkzeug für beide Funktionen erstellt .

Bonus: Verschachtelte Arrays mit indexOfundcontains

Samy Bencherif hat nützliche Funktionen für den Fall vorbereitet , dass Sie in verschachtelten Arrays nach einem bestimmten Objekt suchen. Diese finden Sie hier: https://jsfiddle.net/SamyBencherif/8352y6yw/

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Wie vergleiche ich Arrays in Dart?

Wie vergleiche ich, dass zwei Arrays mit Javascript gleich sind?

Wie vergleiche ich Arrays mit Funktionen höherer Ordnung? JavaScript

Wie vergleiche ich datetime in Javascript?

Wie vergleiche ich Int-Arrays in Java?

Wie vergleiche ich Spalten mit Arrays in BigQuery?

Wie vergleiche ich zwei Arrays in Kotlin?

Wie vergleiche ich denselben Wert in mehreren Arrays?

Wie vergleiche ich zwei Arrays von Objekten?

Wie vergleiche ich zwischen zwei Arrays in PHP?

Wie vergleiche ich zwei Arrays mit Tensorflow?

Wie vergleiche ich bestimmte Zeichen in Arrays?

Wie vergleiche ich zwei verschiedene Arrays mit unterschiedlichen Eigenschaftsnamen und entferne nicht übereinstimmende Arrays in Javascript?

Wie vergleiche ich die Elemente eines Arrays mit dem Index eines anderen Arrays in Javascript?

Wie vergleiche ich zwei Arrays in JavaScript, auch wenn sie nicht bestellt sind?

Wie vergleiche ich den Inhalt eines Javascript-Arrays, aber nicht die Reihenfolge?

Wie vergleiche ich zwei Arrays in JavaScript? Aber der Schlüssel ist eine Zeichenfolge

Wie vergleiche ich Daten in zwei Arrays und gebe das nicht übereinstimmende Array in Javascript zurück?

Wie vergleiche ich Array und Objekt in Javascript?

Wie vergleiche ich grob zwei Strings in Javascript?

Wie vergleiche ich 2 Funktionen in Javascript?

Wie vergleiche ich zwei Objektarrays in Javascript?

Wie vergleiche ich zwei Listenelemente in Javascript miteinander?

Wie vergleiche ich 2 Zahlen in JavaScript?

Wie vergleiche ich zwei Arrays in Standard SQL (BigQuery)?

Wie vergleiche ich zwei Arrays von Objekten nur einmal?

Wie vergleiche ich zwei Char-Arrays in C ++?

Wie vergleiche ich zwei Ganzzahl-Arrays in Scala?

Wie vergleiche ich Werte zwischen zwei verschiedenen assoziativen Arrays in Bash?

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  3. 3

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  4. 4

    Eclipse Oxygen - Projekte verschwinden

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Wie kann ich den Kaskadenmodus global einstellen?

  7. 7

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  8. 8

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  9. 9

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  10. 10

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  11. 11

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  12. 12

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  13. 13

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  14. 14

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  15. 15

    Wie wählt man Unterschiede mit drei Tabellen aus?

  16. 16

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  17. 17

    Wie kann ich meine Tabelle abfragen, um sie in mySQL nach 2 Feldern zu gruppieren?

  18. 18

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  19. 19

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  20. 20

    Modbus Python Schneider PM5300

  21. 21

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

heißlabel

Archiv