通过递归的方式判断两个对象是否相同
function isObject(obj){
return obj !== null && typeof obj === "object";
};
// 对比两个对象是否相同
export const looseEqual = (a, b) => {
if (a === b) {
//如果是绝对相等就直接返回true
return true;
}
//如果不是绝对相等就哦按的他们是否有相同的形状
let isObjectA = isObject(a);
let isObjectB = isObject(b);
if (isObjectA && isObjectB) {
//两个均是对象
try {
let isArrayA = Array.isArray(a);
let isArrayB = Array.isArray(b);
if (isArrayA && isArrayB) {
//如果都是数组
if (a.length === b.length) {
//如果长度相等
return a.every((e, i) => {
//用every和递归来比对a数组和b数组的每个元素,并返回
return looseEqual(e, b[i]);
});
}
//长度都不等直接返回false
return false;
} else if (a instanceof Date && b instanceof Date) {
//如果是Date 则直接getTime 比较
return a.getTime() === b.getTime();
} else if (!isArrayA && !isArrayB) {
//对象的比较
//拿到两个对象的key
let keysA = Object.keys(a);
let keysB = Object.keys(b);
if (keysA.length === keysB.length) {
//如果keys相等
return keysA.every((key) => {
//用every和递归来比对a对象和b对象的每个元素值,并返回
return looseEqual(a[key], b[key]);
});
}
//长度都不等直接返回false
return false;
} else {
return false;
}
} catch (e) {
return false;
}
} else if (!isObjectA && !isObjectB) {
//如果都不是对象则按String来处理
return String(a) === String(b);
} else {
return false;
}
};