如何比较包含循环对象的JavaScript对象

时间:2013-04-07 12:55:48

标签: 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

2 个答案:

答案 0 :(得分: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) );

答案 1 :(得分:1)

编写了一个适合您需求的Comparer函数。但是,它有一个限制,第一个参数应该具有比第二个更多的属性。我可以在function内切换它们,但我认为为此创建临时对象并不好 此外,它将返回false以防:

a1.d = a2
a2.d = a1

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

FIDDLE EXAMPLE

编辑:我刚才有一个想法,在比较循环对象时,你总是得到一个堆栈大小异常,所以你可以try catch对这个异常,但它可能会表现不好。
TRY CATCH EXAMPLE