递归isEqual函数导致Chrome冻结

时间:2017-08-28 13:01:59

标签: javascript json google-chrome recursion

我有2个大对象要比较。我想知道他们是否平等 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分钟后关闭不响应的标签。怎么解决这个问题?

2 个答案:

答案 0 :(得分:1)

使用Lodash isEqual为您执行此操作。

https://lodash.com/docs/4.17.4#isEqual

答案 1 :(得分:-1)

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

Object.keys(ar1)。length!== Object.keys(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)