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?"

1voto

Nibras Punkte 311

Nach langem Suchen habe ich folgende funktionierende Lösung gefunden

function isEquivalent(a, b) {
   // Create arrays of property names
   var aProps = Object.getOwnPropertyNames(a);
   var bProps = Object.getOwnPropertyNames(b);

  // If number of properties is different, objects are not equivalent
  if (aProps.length != bProps.length) {
     return false;
  }

  for (var i = 0; i < aProps.length; i++) {
     var propName = aProps[i];

    // If values of same property are not equal, objects are not equivalent
     if (a[propName] !== b[propName]) {
         return false;
     }
  }

// If we made it this far, objects are considered equivalent
return true; }

Für weitere Informationen: Objektgleichheit in JavaScript

1 Stimmen

Dieser Code schlägt bei Objektgegenstücken von Primitiven fehl; console.log(isEquivalent(new Number('3'), new Number('5'))); druckt true .

1voto

Bei Objekten (ohne Methoden) müssen wir prüfen, ob nested Objects , Arrays y primitive types . Objekte können andere Objekte und Arrays haben (Arrays können auch andere Objekte und Arrays enthalten), daher können wir rekursive Funktionen wie unten verwenden: arrayEquals prüft Arrays auf Gleichheit und equals prüft die Gleichheit der Objekte:

function arrayEquals(a, b) {
    if (a.length != b.length) {
        return false;
    }
    for (let i = 0; i < a.length; i++) {
        if (a[i].constructor !== b[i].constructor) {
            return false;
        }

        if (a[i] instanceof Array && b[i] instanceof Array) {
            if (!arrayEquals(a, b)) {
                return false;
            }
        } else if (a[i] instanceof Object && b[i] instanceof Object) {
            if (!equals(a[i], b[i])) {
                return false;
            }
        } else if (a[i] !== b[i]) {
            return false;
        }
    }
    return true;
}

function equals(a, b) {
    for (let el in a) {
        if (b.hasOwnProperty(el)) {
            if (a[el].constructor !== b[el].constructor) {
                return false;
            }

            if (a[el] instanceof Array && b[el] instanceof Array) {
                if (!arrayEquals(a[el], b[el])) {
                    return false;
                }
            } else if (a[el] instanceof Object && b[el] instanceof Object) {
                if (!equals(a[el], b[el])) {
                    return false;
                }
            } else if (a[el] !== b[el]) {
                return false;
            }
        } else {
            return false;
        }
    }
    return true;
}

Stellen Sie sich vor, Sie haben zwei Objekte:

let a = {
    a: 1,
    b: { c: 1, d: "test" },
    c: 3,
    d: [{ a: [1, 2], e: 2 }, "test", { c: 3, q: 5 }],
};

let b = {
    a: 1,
    b: { c: 1, d: "test" },
    c: 3,
    d: [{ a: [1, 2], e: 2 }, "test", { c: 3, q: 5 }],
};

Und hier unter Verwendung der oben genannten equals können Sie zwei dieser Objekte wie folgt vergleichen:

if(equals(a, b)) {
    // do whatever you want
}

1voto

pery mimon Punkte 6536

2022:

Ich habe einen kinderleichten Algorithmus entwickelt, der die meisten Grenzfälle abdeckt.

Schritte:

  1. die Objekte abflachen
  2. einfach die beiden abgeflachten Objekte vergleichen und nach Unterschieden suchen

Wenn Sie das flachgelegte Objekt gespeichert haben, können Sie es erneut verwenden.

let obj1= {var1:'value1', var2:{ var1:'value1', var2:'value2'}};
let obj2 = {var1:'value1', var2:{ var1:'value11',var2:'value2'}} 

let flat1= flattenObject(obj1)
/*
{
 'var1':'value1',
 'var2.var1':'value1',
 'var2.var2':'value2'
}
*/
let flat2= flattenObject(obj2)
/*
{
 'var1':'value1',
 'var2.var1':'value11',
 'var2.var2':'value2'
}
*/
isEqual(flat1, flat2)
/*
 false
*/

natürlich können Sie mit Ihren Implementierungen für diese Schritte kommen. aber hier ist meine:

Durchführungsbestimmungen

function flattenObject(obj) {
 const object = Object.create(null);
 const path = [];
 const isObject = (value) => Object(value) === value;

 function dig(obj) {
  for (let [key, value] of Object.entries(obj)) {
    path.push(key);
    if (isObject(value)) dig(value);
    else object[path.join('.')] = value;
    path.pop();
  }
 }

 dig(obj);
 return object;
}

 function isEqual(flat1, flat2) {
    for (let key in flat2) {
        if (flat1[key] !== flat2[key])
            return false
    }
    // check for missing keys
    for (let key in flat1) {
        if (!(key in flat2))
            return false
    }
    return true
}

Sie können diese Methode auch verwenden, um das Diff-Objekt zwischen obj1 y obj2 .

Einzelheiten finden Sie in dieser Antwort: Allgemeiner tiefer Unterschied zwischen zwei Objekten

1voto

PunjCoder Punkte 420

Ich bin kein Javascript-Experte, aber hier ist ein einfacher Versuch, das Problem zu lösen. Ich prüfe auf drei Dinge:

  1. Ist es ein object und auch, dass es sich nicht um null denn typeof null es object .
  2. Wenn die Anzahl der Eigenschaften der beiden Objekte gleich ist? Wenn nicht, sind sie nicht gleich.
  3. Schleife durch die Eigenschaften des einen Objekts und Prüfung, ob die entsprechende Eigenschaft im zweiten Objekt denselben Wert hat.

    function deepEqual (first, second) { // Not equal if either is not an object or is null. if (!isObject(first) || !isObject(second) ) return false;

    // If properties count is different if (keys(first).length != keys(second).length) return false;

    // Return false if any property value is different. for(prop in first){ if (first[prop] != second[prop]) return false; } return true; }

    // Checks if argument is an object and is not null function isObject(obj) { return (typeof obj === "object" && obj != null); }

    // returns arrays of object keys function keys (obj) { result = []; for(var key in obj){ result.push(key); } return result; }

    // Some test code obj1 = { name: 'Singh', age: 20 }

    obj2 = { age: 20, name: 'Singh' }

    obj3 = { name: 'Kaur', age: 19 }

    console.log(deepEqual(obj1, obj2)); console.log(deepEqual(obj1, obj3));

0 Stimmen

Behandelt keine verschachtelten Objekte

0voto

Pak Ho Cheung Punkte 1394
  1. die Objekte sortieren (Wörterbuch)
  2. JSON-String vergleichen

    function areTwoDictsEqual(dictA, dictB) {
        function sortDict(dict) {
            var keys = Object.keys(dict);
            keys.sort();
    
            var newDict = {};
            for (var i=0; i<keys.length; i++) {
                var key = keys[i];
                var value = dict[key];
                newDict[key] = value;
            } 
            return newDict;
        }
    
        return JSON.stringify(sortDict(dictA)) == JSON.stringify(sortDict(dictB));
    }

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