2015-04-01 38 views
0

我自學JavaScript和我卡在從洋洋灑灑的JavaScript以下問題:使用Javascript - deepEqual比較和遞歸

寫一個函數,deepEqual,取兩個值並返回true 僅當它們具有相同的值或具有相同 屬性的對象時,其值與遞歸調用deepEqual的 相比也相等。要找出是否通過 標識(使用===運算符)或通過查看它們的 屬性來比較兩個事物,可以使用typeof運算符。如果它爲兩個值生成「對象」 ,則應該進行深入比較。但是你必須考慮一個愚蠢的例外:由於歷史事故,輸入 null也會產生「對象」。

我的問題: 爲什麼console.log(deepEqual(obj, {here: {is: "an"}, object: 2}))出來的假時a[key]{ is: 'an' }b[key]{ is: 'an' },但真正當代碼與!deepEqual(a[key], b[key])取代?

代碼:

function deepEqual(a, b){ 
    if (a === b) { 
     return true; 
    } 
    else if (typeof a== typeof b && !(a===null ||b===null)){ 
     for(var key in b){ 
      for(key in a){ 
       if(! (key in a)){ 
        return false; 
       } 
       else if (a[key] !== b[key]){ 
        return false; 
       } 
       else 
        return true; 
      } 
     } 
    } 
    else 
     return false; 
} 

var obj = {here: {is: "an"}, object: 2}; 
console.log(deepEqual(obj, {here: {is: "an"}, object: 2})); 
+0

您錯過了「遞歸調用deepEqual」的部分。答案在問題中。 :)什麼是'obj'? – 2015-04-01 01:04:12

+0

我很困惑爲什麼'(a [key]!== b [key])'和遞歸函數做的不一樣。 (我試圖非遞歸地解決問題。)我編輯了問題以反映obj變量。 – Autumn 2015-04-01 16:25:48

回答

1

因爲a[key]b[key]都是對象,你需要使用它們deepEquals爲好。

目前,您不會以遞歸方式調用deepEquals,所以不會有這種情況發生。

+0

謝謝,我明白遞歸函數現在是如何工作的。但是,爲了非遞歸地解決問題,我需要做些什麼?如果一個&b是對象,我們可以檢查'a === b'。如果'a [key]'和'b [key]'也是對象,我們怎麼不能檢查'a [key]!== b [key]'? – Autumn 2015-04-01 16:23:16