2013-04-07 98 views
2

請告訴我比較包含循環對象的JavaScript對象。如何比較包含循環對象的JavaScript對象

如下所示,返回true,因爲a1等於a2。

a1 = {} 
a1.b = 1 
a1.c = 2 
a1.d = a 

a2 = {} 
a2.b = 1 
a2.c = 2 
a2.d = a2 

如下所示,返回false是因爲a1不等於a2。

a1 = {} 
a1.b = 1 
a1.c = 2 
a1.d = a 

a2 = {} 
a2.b = 1 
a2.c = 2 
a2.d = a2 
a2.e = a2 
+0

你如何比較這兩個對象? – Anoop 2013-04-07 12:57:57

+0

@Sushil這是他的問題 – Stasel 2013-04-07 13:00:42

+0

我弄錯了問題 – Anoop 2013-04-07 13:06:02

回答

1

試試這個jsfiddle

var a1 = {} 
a1.b = 1 
a1.c = 2 
a1.d = a1 

var a2 = {} 
a2.b = 1 
a2.c = 2 
a2.d = a2 

function isSame(a,b){ 
    var same = true; 
    if(a === b){ 
     return true; 
    } 
    for(var i in a){ 

     if(typeof a[i] == "object"){ 
      if(a[i] == a){ 
       continue; 
      } 
      same = isSame(a[i], b[i]); 
      if(same == false){ 
       return same; 
      } 
     } 
     if(a[i] !== b[i]) 
     return false; 
    } 
    return true 
} 

console.log(isSame(a1, a2)); 
+0

'RangeError:超過最大調用堆棧大小'。我猜,OP有一個錯字:'a1.d = a1' – 2013-04-07 13:02:38

+0

@ArtyomNeustroev固定檢查提琴手 – Anoop 2013-04-07 13:05:05

+0

@Suhil現在它返回'false',但意味着在這種情況下返回'true'。 – 2013-04-07 13:05:33

1

寫了Comparer功能,適合您的需要。但是,它有一個限制,第一個參數應該比第二個參數具有更多的屬性。我可以在function之內切換它們,但我認爲不適合爲此創建臨時對象。
此外,它會在情況恢復false

a1.d = a2 
a2.d = a1 

告訴我,如果你需要處理這種情況了。

FIDDLE EXAMPLE

編輯:我只是有一個想法,那你永遠得到一個堆棧大小異常,騎自行車比較對象時,這樣你就可以try catch這一例外,但它可能會產生糟糕的表現。
TRY CATCH EXAMPLE

+0

謝謝你,對不起。我正在開發測試工具。 其概念是「沒有編碼測試,JavaScript自動測試」。 https://github.com/puriketu99/porky 這就是爲什麼我需要比較他們,但我扣留了一次。 – prk2 2013-05-09 06:34:16