2017-08-28 43 views
3

我有2級大的要比較的對象。我想知道他們是否平等。
JSON.stringify(obj1) == JSON.stringify(obj2)不起作用,因爲是動態創建的對象,使屬性的順序是隨機的。遞歸函數的isEqual導致鉻凍結

所以我寫了一個isEqual()如下。

function isEqual(ar1, ar2) { 
    if(ar1 !== ar2) { 
     if(typeof ar1 !== typeof ar2) { 
      return false; 
     } 
     if(ar1 == null) { 
      if(ar2 == null) { 
       return true; 
      } 
      return false; 
     } 
     if(ar2 == null) { 
      if(ar1 == null) { 
       return true; 
      } 
      return false; 
     } 
     if(typeof ar1 !== 'object') { 
      return false; 
     } 
     if (ar1.length !== ar2.length) { 
      return false; 
     } 
     for(var i in ar1) { 
      if(!isEqual(ar1[i], ar2[i])) { 
       return false; 
      } 
     } 
     for(var i in ar2) { 
      if(!isEqual(ar1[i], ar2[i])) { 
       return false; 
      } 
     } 
    } 
    return true; 
} 

現在,如果我跑isEqual(obj1, obj2)鉻凍結的標籤,我不能夠關閉的選項卡。我必須等到chrome要求我在大約10分鐘後關閉不響應的選項卡。如何解決這個問題?

+1

什麼是您的輸入數據?你有循環參考嗎? – PeterMader

+1

如果在對象中有循環,則遞歸遍歷可能會卡住。 – Pointy

+1

你可能有循環引用,你可以使用https://lodash.com/docs/4.17.4#isEqual檢查平等 – marvel308

回答

-1

我想提供我的解決方案。請使用您的JSON對象進行嘗試。 以檢查對象有不同數量的領域,你可以用

Object.keys(AR1)。長度!== Object.keys(AR2)。長度

function isEqual(ar1, ar2) { 
    if((ar1 === null) && (ar2 === null)) 
     return true; 


    //console.info("Type: " + typeof ar1 + ":" + typeof ar2) 
    if (typeof ar1 !== typeof ar2) { 
     return false; 
    } 
    console.info("Length: " + ar1.length + ":" + ar2.length) 
    if (ar1.length !== ar2.length) { 
     return false; 
    } 

    if((typeof ar1 === 'object') && (typeof ar2 === 'object') && (Object.keys(ar1).length !== Object.keys(ar2).length)) 
     return false; 

    if ((typeof ar1 !== 'object') && (typeof ar2 !== 'object')) { 
     //console.info("Value is not equal: " + (ar1 !== ar2)) 
     if (ar1 !== ar2) 
      return false; 
     else 
      return true; 
    } 
    for (var i in ar1) { 
     //console.info("Values:" + ar1[i] + ":" + ar2[i]) 
     if (!isEqual(ar1[i], ar2[i])) { 
      return false; 
     } 
    } 
    return true; 
} 
var obj1 = { 
    a : 1, 
    b :[1, 2, 3], 
    c: {a:1} 

}; 
var obj2 = { 
    a : 1, 
    b : [1, 2, 3], 
    c: {a:1}, 
    d:1 
}; 
isEqual(obj1, obj2) 
+0

我所需要的第二循環,因爲有時也有在物鏡2的某些屬性中不存在在OBJ1。起初我只有一個循環,但在某些情況下,這個「isEqual」被認爲是兩個物體相等,即使它們不是。 –

+0

啊。我認爲.arr.length應該考慮一下。你可以給我一個例子嗎? – volkinc

+0

增加了對isEqual(null,null)和null組合缺失的檢查 – volkinc