思路
通常需要进行深度比较的是对象,方法一般不需要。
思路要点:
以obj1
和obj2
为例:
- 先判断
obj1``obj2
是否是对象
,若其中一个不是对象
或者两个都不是对象
,直接进行obj1===obj2
的判断,若两者都是对象
,进行步骤2
- 若
obj1, obj2
都是对象,直接进行obj1===obj2
,若相等,返回true
,否则进行第三步
- 判断
obj1 , obj2
的keys
长度是否相等,若不相等,直接返回false
,相等则进行第四步
- 对
obj1
进行循环对比,采取递归
的思路,若比较过程中返回了false
,则整个函数直接返回false
- 若遍历结束,都没返回false,直接返回true.
代码实现
//判断是否是对象
function isObject(obj) {
return typeof obj === "object" && obj != null;
}
//深度比较函数:isQual
function isQual(obj1, obj2) {
//判断obj1和obj2是否式对象,若不是则直接===比较
if (!isObject(obj1) || !isObject(obj2)) {
return obj1 === obj2;
}
//直接判断obj1===obj2
if (obj1 === obj2) {
return true;
}
//判断obj1和obj2的长度是否相等
let obj1Keys = Object.keys(obj1),
obj2Keys = Object.keys(obj2);
if (obj1Keys.length !== obj2Keys.length) return false;
//遍历对象,进行判断
for (let key in obj1) {
const res = isQual(obj1[key], obj2[key]);
if (!res) {
return false;
}
}
return true;
}
//定义a,b对象
let a = {
a: 1,
b: {
c: 2,
d: {
e: 10,
},
},
};
let b = {
r: 1,
b: {
c: 2,
d: {
e: 20,
},
},
};
//调用
let c=[1,[2,[3,[4]]],5]
let d=[1,[2,[3,[4]]],6]
console.log(isQual(a, b));
console.log(isQual(c, d));
结果
总结
深度比较
主要比较的是对象
和数组
,上述代码可以满足对象
和数组
的比较。