判断对象相等的步骤:
1.先判断俩者是不是对象
2.是对象后俩者长度是否一致
3.判断俩个对象的所有key值是否相等相同
4.判断俩个对象的相应的key对应的值是否相同
5.来一个递归判断里面的对象循环1-4步骤
function diff(obj1, obj2) {
var o1 = obj1 instanceof Object;
var o2 = obj2 instanceof Object;
// 判断是不是对象
if (!o1 || !o2) {
return obj1 === obj2;
}
//Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,
//例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2;
if (Object.keys(obj1).length !== Object.keys(obj2).length) {
return false;
}
for (var o in obj1) {
var t1 = obj1[o] instanceof Object;
var t2 = obj2[o] instanceof Object;
if (t1 && t2) {
if (!diff(obj1[o], obj2[o])) {
return false
}
} else if (obj1[o] !== obj2[o]) {
return false;
}
}
return true;
}
方法2
function isObjectValueEqual(obj1, obj2) {
var o1 = obj1 instanceof Object;
var o2 = obj2 instanceof Object;
// 判断是不是对象
if (!o1 || !o2) {
return obj1 === obj2;
}
var aProps = Object.keys(obj1);
var bProps = Object.keys(obj2);
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i]
var propA = obj1[propName]
var propB = obj2[propName]
// 2020-11-18更新,这里忽略了值为undefined的情况
// 故先判断两边都有相同键名
if (!obj2.hasOwnProperty(propName)) return false
if ((propA instanceof Object)) {
if (!isObjectValueEqual(propA, propB)) {
return false
}
} else if (propA !== propB) {
return false
}
}
return true
}
网友评论