ES6有一個(gè)方法來(lái)判斷兩個(gè)對(duì)象是否相等
console.log(Object.is(a,b))
但是這個(gè)相等眶诈,和我們平時(shí)要的相等可能不一樣
這個(gè)方法判斷的是a和b是不是同一個(gè)指針的對(duì)象
比如說(shuō)
var a = {
id:1
};
var b = a;
console.log(Object.is(a,b)); //true
但是下面這種情況就不管用了
var a = {
id:1
};
var b = {
id:1
}
console.log(Object.is(a,b)); //false
當(dāng)我們只需要兩個(gè)對(duì)象的內(nèi)容相同的時(shí)候,他就沒(méi)效果了
思路
只要兩個(gè)對(duì)象的名和鍵值都相同品腹。那么兩個(gè)對(duì)象的內(nèi)容就相同了
1.用Object.getOwnPropertyNames拿到對(duì)象的所以鍵名數(shù)組
2.比對(duì)鍵名數(shù)組的長(zhǎng)度是否相等胶逢。否=>false饭聚。真=>3
3.比對(duì)鍵名對(duì)應(yīng)的鍵值是否相等
function isObjectValueEqual(a, b) {
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i];
var propA = a[propName];
var propB = b[propName];
if ( propA !== propB) {
return false;
}
}
return true;
}
粗略一看沒(méi)問(wèn)題
但是細(xì)心的同學(xué)發(fā)現(xiàn)如果 鍵值也是對(duì)象的話
那這個(gè)方法就不管用了
var a = {
id:1,
name:2,
c:{
age:3
}
};
var b = {
id:1,
name:2,
c:{
age:3
}
}
console.log(isObjectValueEqual(a,b));//false
這個(gè)時(shí)候遞歸一下就可以解決了
注意蛔溃,遞歸的時(shí)候要判斷prop是不是Object肌毅,然后會(huì)進(jìn)入無(wú)限遞歸的死循環(huán)
function isObjectValueEqual(a, b) {
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i]
var propA = a[propName]
var propB = b[propName]
// 2020-11-18更新砌烁,這里忽略了值為undefined的情況
// 故先判斷兩邊都有相同鍵名
if(!b.hasOwnProperty(propName)) return false
if ((propA instanceof Object)) {
if (this.isObjectValueEqual(propA, propB)) {
// return true 這里不能return ,后面的對(duì)象還沒(méi)判斷
} else {
return false
}
} else if (propA !== propB) {
return false
} else { }
}
return true
}
var a = {
id:1,
name:2,
c:{
age:3
}
};
var b = {
id:1,
name:2,
c:{
age:3
}
}
console.log(isObjectValueEqual(a,b));//true