思路
通常需要进行深度比较的是对象,方法一般不需要。
思路要点:
以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));
结果
总结
深度比较 主要比较的是对象和数组,上述代码可以满足对象和数组的比较。