995 Stimmen

Wie bestimmt man die Gleichheit zweier JavaScript-Objekte?

Ein strikter Gleichheitsoperator sagt Ihnen, ob zwei Objekte Typen gleich sind. Gibt es jedoch eine Möglichkeit zu erkennen, ob zwei Objekte gleich sind, ähnlich wie der Hash-Code Wert in Java?

Stack Overflow Frage Gibt es irgendeine Art von HashCode-Funktion in JavaScript? ist dieser Frage ähnlich, erfordert aber eine eher akademische Antwort. Das obige Szenario zeigt, warum es notwendig wäre, eine zu haben, und ich frage mich, ob es irgendeine gleichwertige Lösung .

5 Stimmen

Gehen Sie auch dieser Frage nach stackoverflow.com/q/1068834/1671639

55 Stimmen

Beachten Sie, dass auch in Java, a.hashCode() == b.hashCode() tut no bedeuten, dass a ist gleich b . Das ist eine notwendige, aber keine hinreichende Bedingung.

7 Stimmen

Wenn Sie Objekte in Ihrem Code vergleichen MÜSSEN, dann haben Sie Ihren Code wahrscheinlich falsch geschrieben. Die bessere Frage könnte lauten: "Wie kann ich diesen Code so schreiben, dass ich keine Objekte vergleichen muss?"

3voto

Sergiy Seletskyy Punkte 14714

Wie kann man feststellen, dass das Teilobjekt (Partial<T>) gleich dem Originalobjekt (T) in typescript ist.

function compareTwoObjects<T>(original: T, partial: Partial<T>): boolean {
  return !Object.keys(partial).some((key) => partial[key] !== original[key]);
}

P.S. Ursprünglich hatte ich vor, eine neue Frage mit einer Antwort zu erstellen. Aber eine solche Frage existiert bereits und wurde als Duplikat markiert.

3voto

Mirek Rusin Punkte 17854

Wenn Sie JSON-Objekte vergleichen, können Sie https://github.com/mirek/node-rus-diff

npm install rus-diff

使用方法

a = {foo:{bar:1}}
b = {foo:{bar:1}}
c = {foo:{bar:2}}

var rusDiff = require('rus-diff').rusDiff

console.log(rusDiff(a, b)) // -> false, meaning a and b are equal
console.log(rusDiff(a, c)) // -> { '$set': { 'foo.bar': 2 } }

Wenn zwei Objekte unterschiedlich sind, wird eine MongoDB-kompatible {$rename:{...}, $unset:{...}, $set:{...}} wie ein Objekt zurückgegeben.

3voto

xameeramir Punkte 25274

Vorausgesetzt, dass die Reihenfolge der Eigenschaften im Objekt nicht geändert wird.

JSON.stringify() funktioniert sowohl für tiefe als auch für nicht-tiefe Objekttypen, wobei die Leistungsaspekte nicht ganz klar sind:

var object1 = {
  key: "value"
};

var object2 = {
  key: "value"
};

var object3 = {
  key: "no value"
};

console.log('object1 and object2 are equal: ', JSON.stringify(object1) === JSON.stringify(object2));

console.log('object2 and object3 are equal: ', JSON.stringify(object2) === JSON.stringify(object3));

1 Stimmen

Dies entspricht nicht den Wünschen des Auftraggebers, da es nur dann zu einer Übereinstimmung kommt, wenn beide Objekte die gleichen Schlüssel haben, was nicht der Fall ist. Es würde auch erfordern, dass die Schlüssel in der gleichen Reihenfolge sein, die auch nicht wirklich sinnvoll ist.

3 Stimmen

Was ist, wenn die Eigenschaften in unterschiedlicher Reihenfolge sind? Nein, das ist keine gute Methode

2voto

Lex Punkte 2458

Dies ist ein Zusatz für alle oben genannten, nicht ein Ersatz. Wenn Sie einen schnellen, flachen Vergleich von Objekten benötigen, ohne dass Sie zusätzliche rekursive Fälle prüfen müssen. Hier ist ein Schuss.

Es wird verglichen auf: 1) Gleichheit der Anzahl der eigenen Eigenschaften, 2) Gleichheit der Schlüsselnamen, 3) wenn bCompareValues == true, Gleichheit der entsprechenden Eigenschaftswerte und ihrer Typen (dreifache Gleichheit)

var shallowCompareObjects = function(o1, o2, bCompareValues) {
    var s, 
        n1 = 0,
        n2 = 0,
        b  = true;

    for (s in o1) { n1 ++; }
    for (s in o2) { 
        if (!o1.hasOwnProperty(s)) {
            b = false;
            break;
        }
        if (bCompareValues && o1[s] !== o2[s]) {
            b = false;
            break;
        }
        n2 ++;
    }
    return b && n1 == n2;
}

2voto

Oliver Dixon Punkte 6507

Ich sehe Spaghetti-Code-Antworten. Ohne die Verwendung von Drittanbieter-Libs, ist dies sehr einfach.

Sortieren Sie zunächst die beiden Objekte nach ihren Schlüsselnamen.

let objectOne = { hey, you }
let objectTwo = { you, hey }

// If you really wanted you could make this recursive for deep sort.
const sortObjectByKeyname = (objectToSort) => {
    return Object.keys(objectToSort).sort().reduce((r, k) => (r[k] = objectToSort[k], r), {});
}

let objectOne = sortObjectByKeyname(objectOne)
let objectTwo = sortObjectByKeyname(objectTwo)

Verwenden Sie dann einfach eine Zeichenkette, um sie zu vergleichen.

JSON.stringify(objectOne) === JSON.stringify(objectTwo)

1 Stimmen

Dies funktioniert auch nicht für Deep Copy, es hat nur eine Iterationstiefe.

0 Stimmen

Ich denke, @andras meint, dass Sie die Schlüssel von verschachtelten Objekten rekursiv sortieren müssen.

0 Stimmen

@eksapsy unterschiedliche Probleme haben unterschiedliche Lösungen. Lesbarkeit übertrumpft bei der Programmierung immer die Leistung, obwohl wir heute auf modernen Systemen den Speicher schonen können, Optimierungen sind die Wurzel des Übels bei der Programmierung. Ich bin sicher, wenn Sie "riesige" Objekte haben, dann ist die gesamte Architektur wahrscheinlich falsch; Sie sollten dann etwas wie Elastic für große JSON-Sammlungen in Betracht ziehen. Es gibt viele verschiedene Lösungen für dieses Problem, ich bin sicher, es könnte besser sein, ich habe das vor Jahren in aller Eile geschrieben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X