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组合的检查