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

tmkly3 Punkte 2881

Ein schneller "Hack", um festzustellen, ob zwei Objekte ähnlich sind, ist die Verwendung ihrer toString()-Methoden. Wenn Sie die Objekte A und B prüfen, stellen Sie sicher, dass A und B sinnvolle toString()-Methoden haben, und prüfen Sie, ob die von ihnen zurückgegebenen Zeichenketten gleich sind.

Das ist kein Allheilmittel, aber in den richtigen Situationen kann es manchmal nützlich sein.

-1voto

Golo Roden Punkte 125652

Ich habe eine kleine Bibliothek geschrieben, die auf Node.js und dem Browser läuft und compare.js heißt. Sie bietet die üblichen Vergleichsoperatoren wie ==, !=, >, >=, <, <= und Identität für alle Datentypen von JavaScript.

Sie können z. B. Folgendes verwenden

cmp.eq(obj1, obj2);

und prüft auf Gleichheit (mit einem Deep-Equal-Ansatz). Andernfalls, wenn Sie

cmp.id(obj1, obj2);

wird durch Verweis verglichen, also auf Identität geprüft. Sie können auch < und > für Objekte verwenden, was Teilmenge und Obermenge bedeutet.

compare.js wird von fast 700 Unit-Tests abgedeckt, daher sollte es hoffentlich nicht zu viele Bugs haben ;-).

Sie finden es unter https://github.com/goloroden/compare.js ist kostenlos und steht unter der MIT-Lizenz zur Verfügung.

-1voto

Mahmoud Magdy Punkte 391

Ich habe bereits eine Antwort hinzugefügt, aber sie war nicht perfekt, aber diese hier prüft die Gleichheit der Objekte

function equalObjects(myObj1, myObj2){

let firstScore = 0;
let secondScore = 0;
let index=0;

let proprtiesArray = [];
let valuesArray = [];

let firstLength = 0;
let secondLength = 0;

for (const key in myObj1) {
    if (myObj1.hasOwnProperty(key)) {
        firstLength += 1;
        proprtiesArray.push(key);
        valuesArray.push(myObj1[key]);        
        firstScore +=1;
    }
}

for (const key in myObj2) {
    if (myObj2.hasOwnProperty(key)) {
        secondLength += 1;
        if (valuesArray[index] === myObj2[key] && proprtiesArray[index] === key) {
          secondScore +=1;
        }
        //console.log(myObj[key]);

        index += 1;
    }

}

if (secondScore == firstScore && firstLength === secondLength) {
   console.log("true", "equal objects");
   return true;
} else {
   console.log("false", "not equal objects");
   return false;
}

}

equalObjects({'firstName':'Ada','lastName':'Lovelace'},{'firstName':'Ada','lastName':'Lovelace'});

equalObjects({'firstName':'Ada','lastName':'Lovelace'},{'firstName':'Ada','lastName1':'Lovelace'});

equalObjects({'firstName':'Ada','lastName':'Lovelace'},{'firstName':'Ada','lastName':'Lovelace', 'missing': false});

1 Stimmen

Berücksichtigt keine Arrays oder verschachtelte Eigenschaften

1 Stimmen

Ich habe es nicht für Konto-Arrays oder verschachtelte Eigenschaften gemacht Es machte, um die Gleichheit zwischen direkten 2 Objekte zu überprüfen

-1voto

Bernd Jendrissek Punkte 1058

Ich brauche, um jQuery POST-Anforderungen zu spiegeln, so dass die Gleichheit, die mir wichtig ist, ist, dass beide Objekte den gleichen Satz von Eigenschaften haben (keine fehlende in jedem Objekt), und dass jede Eigenschaft Wert "gleich" (nach dieser Definition) ist. Ich kümmere mich nicht um die Objekte mit nicht übereinstimmenden Methoden.

Das werde ich verwenden, es sollte ausreichen für mein Spezifikum Anforderungen:

function PostRequest() {
    for (var i = 0; i < arguments.length; i += 2) {
        this[arguments[i]] = arguments[i+1];
    }

    var compare = function(u, v) {
        if (typeof(u) != typeof(v)) {
            return false;
        }

        var allkeys = {};
        for (var i in u) {
            allkeys[i] = 1;
        }
        for (var i in v) {
            allkeys[i] = 1;
        }
        for (var i in allkeys) {
            if (u.hasOwnProperty(i) != v.hasOwnProperty(i)) {
                if ((u.hasOwnProperty(i) && typeof(u[i]) == 'function') ||
                    (v.hasOwnProperty(i) && typeof(v[i]) == 'function')) {
                    continue;
                } else {
                    return false;
                }
            }
            if (typeof(u[i]) != typeof(v[i])) {
                return false;
            }
            if (typeof(u[i]) == 'object') {
                if (!compare(u[i], v[i])) {
                    return false;
                }
            } else {
                if (u[i] !== v[i]) {
                    return false;
                }
            }
        }

        return true;
    };

    this.equals = function(o) {
        return compare(this, o);
    };

    return this;
}

So verwenden:

foo = new PostRequest('text', 'hello', 'html', '<p>hello</p>');
foo.equals({ html: '<p>hello</p>', text: 'hello' });

-1voto

stamat Punkte 1664

Einige der folgenden Lösungen haben Probleme mit Leistung, Funktionalität und Stil... Sie sind nicht durchdacht genug, und einige von ihnen versagen in verschiedenen Fällen. Ich habe versucht, dieses Problem in meiner eigenen Lösung anzugehen, und würde mich sehr über Ihr Feedback freuen:

http://stamat.wordpress.com/javascript-object-comparison/

//Returns the object's class, Array, Date, RegExp, Object are of interest to us
var getClass = function(val) {
    return Object.prototype.toString.call(val)
        .match(/^\[object\s(.*)\]$/)[1];
};

//Defines the type of the value, extended typeof
var whatis = function(val) {

    if (val === undefined)
        return 'undefined';
    if (val === null)
        return 'null';

    var type = typeof val;

    if (type === 'object')
        type = getClass(val).toLowerCase();

    if (type === 'number') {
        if (val.toString().indexOf('.') > 0)
            return 'float';
        else
        return 'integer';
    }

    return type;
   };

var compareObjects = function(a, b) {
    if (a === b)
        return true;
    for (var i in a) {
        if (b.hasOwnProperty(i)) {
            if (!equal(a[i],b[i])) return false;
        } else {
            return false;
        }
    }

    for (var i in b) {
        if (!a.hasOwnProperty(i)) {
            return false;
        }
    }
    return true;
};

var compareArrays = function(a, b) {
    if (a === b)
        return true;
    if (a.length !== b.length)
        return false;
    for (var i = 0; i < a.length; i++){
        if(!equal(a[i], b[i])) return false;
    };
    return true;
};

var _equal = {};
_equal.array = compareArrays;
_equal.object = compareObjects;
_equal.date = function(a, b) {
    return a.getTime() === b.getTime();
};
_equal.regexp = function(a, b) {
    return a.toString() === b.toString();
};
//  uncoment to support function as string compare
//  _equal.fucntion =  _equal.regexp;

/*
 * Are two values equal, deep compare for objects and arrays.
 * @param a {any}
 * @param b {any}
 * @return {boolean} Are equal?
 */
var equal = function(a, b) {
    if (a !== b) {
        var atype = whatis(a), btype = whatis(b);

        if (atype === btype)
            return _equal.hasOwnProperty(atype) ? _equal[atype](a, b) : a==b;

        return false;
    }

    return true;
};

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