js对比 object 代码,有一个递归的思路
function isObjectValueEqual(a, b) {
if((a == null && b != null) || (b == null && a != null)){
return false;
}
console.info((a instanceof Array) + "<-x>" + (b instanceof Array));
//数组对比
if(a instanceof Array && b instanceof Array){
if(a.length != b.length){
return false;
}
for (var i = 0; i < a.length; i++) {
var aEle = a[i];
var bEle = b[i];
console.info(aEle + "<-xx>" + bEle);
if(aEle.constructor == Object && bEle.constructor == Object){
if(!isObjectValueEqual(aEle, bEle)){
return false;
}
} else if (aEle !== bEle) {
return false;
}
}
for (var i = 0; i < b.length; i++) {
var aEle = a[i];
var bEle = b[i];
console.info(aEle + "<-xxx>" + bEle);
if(aEle.constructor == Object && bEle.constructor == Object){
if(!isObjectValueEqual(aEle, bEle)){
return false;
}
} else if (aEle !== bEle) {
return false;
}
}
} else if(a.constructor == Object && b.constructor == Object){
//对象对比
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];
console.info(propName + ":" + a[propName] + "<->" + b[propName], a[propName].constructor, b[propName].constructor);
if(a[propName].constructor == Object && b[propName].constructor == Object){
if(!isObjectValueEqual(a[propName], b[propName])){
return false;
}
} else if (a[propName] instanceof Array && b[propName] instanceof Array) {
if(!isObjectValueEqual(a[propName], b[propName])){
return false;
}
} else if (a[propName] !== b[propName]) {
return false;
}
}
for (var i = 0; i < bProps.length; i++) {
var propName = bProps[i];
console.info(propName + ":" + a[propName] + "<-->" + b[propName]);
if(a[propName].constructor == Object && b[propName].constructor == Object){
if(!isObjectValueEqual(a[propName], b[propName])){
return false;
}
} else if (a[propName] instanceof Array && b[propName] instanceof Array) {
if(!isObjectValueEqual(a[propName], b[propName])){
return false;
}
} else if (a[propName] !== b[propName]) {
return false;
}
}
}
return true;
}