2

请告诉我比较包含循环对象的 JavaScript 对象。

如下,返回真,因为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
4

2 回答 2

1

Try this 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) );
于 2013-04-07T13:01:58.880 回答
1

写了一个Comparer函数,满足你的需求。但是,它有一个限制,即第一个参数应该比第二个参数具有更多的属性。我可以将它们切换到内部,function但我认为为此创建临时对象并不好。
此外,它会false在以下情况下返回:

a1.d = a2
a2.d = a1

告诉我你是否也需要处理那个案子。

小提琴示例

编辑:我刚刚有了一个想法,在比较循环对象时,你总是会得到一个堆栈大小异常,所以你可以try catch处理这个异常,但它可能会有一个糟糕的性能。
尝试捕获示例

于 2013-04-07T13:22:52.223 回答