2016-07-18 21 views
0

deepEqual函數應該在2個值中查看它們是否完全相同。第一次和第二次測試的結果與預期相符。我在合併遞歸調用的方式上可能有什麼問題嗎?Javascript對象中的值

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

爲什麼不使用== =? – SPlatten

+2

@SPlatten它不適用於對象。它只是測試參考平等。 – 4castle

+0

@SPlatten:OP顯然試圖測試等同性,而不是身份。 –

回答

6

有可能是什麼問題,我結合了遞歸調用的方式嗎?

是的,你正在拋棄它的回報價值。你應該檢查它的返回值,如果它是假的,提前返回false

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

邊注:有在該代碼等幾個問題。我不打算進入它的全面審查,但例如,按照上述測試obj1[prop]if,看它是否是一個對象真的應該else if,如:

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

難以置信你的速度有多快:)不錯! – trincot

+0

@SPlatten:是的,確定,謝謝! –

+0

@ T.J.Crowder因此,原始代碼將無法從該if語句返回任何內容。但是,該函數是否仍然能夠完成'for'循環並最終返回true?我還有一種印象,就是連續的if語句只是按順序運行。在這種情況下它只是重複嗎? – James