Javascript 递归等质量函数导致Chrome冻结

Javascript 递归等质量函数导致Chrome冻结,javascript,json,google-chrome,recursion,Javascript,Json,Google Chrome,Recursion,我有两个大对象要比较。我想知道他们是否平等。 JSON.stringify(obj1)=JSON.stringify(obj2)不起作用,因为对象是动态创建的,所以属性的顺序是随机的 所以我写了一个isEqual(),如下所示 function isEqual(ar1, ar2) { if(ar1 !== ar2) { if(typeof ar1 !== typeof ar2) { return false; } i

我有两个大对象要比较。我想知道他们是否平等。
JSON.stringify(obj1)=JSON.stringify(obj2)
不起作用,因为对象是动态创建的,所以属性的顺序是随机的

所以我写了一个
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中的选项卡冻结,我无法关闭选项卡。我必须等到chrome要求我在大约10分钟后关闭无响应的标签。如何解决这个问题?

我想提供我的解决方案。请尝试使用JSON对象。 为了检查对象是否具有不同数量的可使用字段

对象.键(ar1).length!==Object.key(ar2).length

 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)

使用Lodash的
isEqual
为您完成此操作


您的输入数据是什么?你有循环引用吗?如果你的对象中有循环,你的递归遍历可能会被卡住。你可能有循环引用,你可以用它来检查相等性“我有非常大的对象”有多大?如果没有演示该问题的工作代码,在这里很难为您提供帮助。为什么要在ar1上循环而不是在ar2上循环?我需要第二个循环,因为有时obj 2中有一些属性在obj1中不存在。起初我只有一个循环,但在某些情况下,这个
isEqual
认为两个对象是相等的,即使它们不是。我想,嗯,长度应该考虑一下。你能给我举个例子吗?增加了对缺失的等质量(null,null)和null组合的检查