2016-07-18 6 views
0

Die Funktion "deepEqual" soll 2 Werte aufnehmen, um zu sehen, ob sie genau gleich sind. Die Ergebnisse für den ersten und zweiten Test kommen wie erwartet zurück. Ist vielleicht etwas nicht in Ordnung mit der Art, wie ich den rekursiven Aufruf einbeziehe?Javascript Vergleichswert im Objekt

function deepEqual(obj1, obj2) { 
    if (typeof obj1 == 'object' && typeof obj1 !== null && typeof obj2 == 'object' && typeof obj2 !== null) { 
    if (obj1.length != obj2.length) {return false;} 
    for (var prop in obj1) { 
     if (typeof obj1[prop] == 'object') {deepEqual(obj1[prop], obj2[prop]);} 
     if (obj1[prop] != obj2[prop]) {return false;} 
    } 
    return true; 
    } else if (obj1 === obj2) {return true;} 
    else {return false;} 
} 

var obj = {here: {is: "an"}, object: 2}; 
console.log(deepEqual(obj, obj)); 
// → true -> true 
console.log(deepEqual(obj, {here: 1, object: 2})); 
// → false -> false 
console.log(deepEqual(obj, {here: {is: "an"}, object: 2})); 
// → true -> false 
+0

Warum nicht verwenden == =? – SPlatten

+2

@SPlatten Es funktioniert nicht für Objekte. Es testet nur auf Referenzgleichheit. – 4castle

+0

@SPlatten: Das OP versucht eindeutig, auf Äquivalenz, nicht auf Identität zu testen. –

Antwort

6

Gibt es vielleicht etwas falsch mit der Art, wie ich den rekursiven Aufruf enthält bin?

Ja, Sie werfen seinen Rückgabewert weg. Sie sollten den Rückgabewert überprüfen und, falls dieser falsch ist, false vorzeitig zurückgeben.

if (typeof obj1[prop] == 'object') { 
    if (!deepEqual(obj1[prop], obj2[prop])) { 
     return false; 
    } 
} 

Randbemerkung: Es gibt mehrere andere Fragen in diesem Code. Ich werde nicht in eine vollständige Überprüfung der es bekommen, aber zum Beispiel die if im Anschluss an die Linie über Tests obj1[prop] zu sehen, ob es sich um ein Objekt wirklich else if sein sollte, zum Beispiel:

if (typeof obj1[prop] == 'object') { 
    if (!deepEqual(obj1[prop], obj2[prop])) { 
     return false; 
    } 
} else if (obj1[prop] != obj2[prop]) { 
//^^^^------------------------------------------ here 
    return false; 
} 
+2

Unglaublich, wie schnell du damit warst :) Schön! – trincot

+0

@SPlatten: Ja in der Tat, behoben, danke! –

+0

@ T.J.Crowder So könnte der ursprüngliche Code nichts von dieser if-Anweisung zurückgeben. Wäre die Funktion jedoch nicht in der Lage, die 'for'-Schleife zu beenden und schließlich" true "zurückzugeben? Ich hatte auch den Eindruck, dass aufeinanderfolgende 'if'-Anweisungen gerade ausgeführt wurden. War es in diesem Fall nur Wiederholung? – James

Verwandte Themen