递归深度比较
Recursive Deep Compare
为了递归实践/乐趣,我希望构建一个递归函数,对两个唯一的对象进行深入比较。到目前为止,我的代码带有伪代码注释。
我认为我的错误可能是我对删除的理解,因为递归没有解决obj1和obj2的缩小问题。
function deepCompare(obj1, obj2) {
//Base Cases
if (obj1 === obj2) {
return true;
};
if (Object.keys(obj1).length !== Object.keys(obj2).length) {
return false;
};
//Getting arbitrary key of obj1
var key = Object.keys(obj1)[0];
//Check to see if key is in obj2
if (obj2.hasOwnProperty(key)) {
//Check equality of value at key
if (obj2.key == obj1.key) {
//Remove key/value pair from each object, recursively call
delete obj2.key;
delete obj1.key;
deepCompare(obj1, obj2);
} else {
return false;
}
} else {
return false;
}
}
您的函数缺少空对象的基本情况,即没有自己键的对象(不再有)。它从未真正返回true
(对于不相同的对象)。
所以你需要做
function deepCompare(obj1, obj2) {
//Base Cases
if (obj1 === obj2) {
return true;
}
var keys = Object.keys(obj1);
if (keys.length !== Object.keys(obj2).length) {
return false;
}
if (keys.length == 0) {
return true;
}
//Getting arbitrary key of obj1
var key = keys[0];
…
此外,您在递归调用中忘记了return
语句。
但是请注意,比较函数应该永远不要修改它试图比较的值。所以不要使用delete
,而是在键上使用循环。
function deepCompare(obj1, obj2) {
if (obj1 === obj2) return true;
if (typeof obj1 != typeof obj2) return false; // needed for structurally different objects
if (Object(obj1) !== obj1) return false; // primitive values
var keys = Object.keys(obj1);
if (keys.length != Object.keys(obj2).length) return false;
for (var i=0; i<keys.length; i++) {
var key = keys[i];
if (!Object.prototype.hasOwnProperty.call(obj2, key)) return false;
if (!deepCompare(obj1[key], obj2[key])) return false;
}
return true;
}
希望它能帮助
编辑,谢谢@TrueBlueAussie
function deepcompare(a, b){
if(typeof a !== typeof b) return false;
if(typeof a !== 'object') return a === b;
if(Object.keys(a).length != Object.keys(b).length) return false;
for(var k in a){
if(!(k in b)) return false;
if(!deepcompare(a[k], b[k])) return false;
}
return true;
}
相关文章:
- 比较从函数和生成的日期对象
- 如何使用 node.js 比较两个 json 数组
- jQuery自定义验证比较多个输入的序列
- 反向字符串比较
- 通过JSON&比较时间
- 递归深度比较
- 与 lodash 进行对象深度比较的数组
- Javascript 深度比较
- 角度深度比较对象(特定属性除外)
- JS深度比较2个对象并删除在第二个对象中找到的项目,而不是第一个
- Javascript -深度相等比较
- 是否有一个实用程序来深度比较对象在谷歌闭包库
- 存储在Mongo中的数组无法与具有相同长度和值的本地javascript数组进行深度断言比较
- 初学者- Javascript中的深度比较
- Angular进行深度比较,并返回每一项的差值
- 使用JSON可以吗?Stringify用于深度比较和克隆
- 深度比较(Eloquent Javascript第4章):代码在测试用例中失败
- Javascript:深度比较
- 深度递归比较:对象和属性
- 这个柜台的功能是什么?雄辩的JavaScript 4.4深度比较的例子