网上找了几个方法最后还是自己写一个。
Object.prototype.toString(); 这个方法用来判断数据类型很适用,决定使用这个来写。
/**
*
* @param obj1 <any>
* @param obj2 <any>
*/
function compare2Obj(obj1, obj2) {
const objToStr = Object.prototype.toString;
if (obj1 === obj2) {
return true;
} else if (objToStr.call(obj1) === '[object Object]' && objToStr.call(obj2) === '[object Object]') { // 对象
let keys1 = Object.keys(obj1);
let keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) {
return false;
} else {
for (let i = 0; i < keys1.length; i++) {
let value1 = obj1[keys1[i]];
let value2 = obj2[keys1[i]];
if (!compare2Obj(value1, value2)) {
return false;
}
}
return true;
}
} else if (objToStr.call(obj1) === '[object Array]' && objToStr.call(obj2) === '[object Array]') { // 数组
if (obj1.length === obj2.length) {
for (var arrIndex = 0, hasTheSame = false; arrIndex < obj1.length; arrIndex++) {
hasTheSame = false;
for (let j = arrIndex; j < obj2.length; j++) {
if (compare2Obj(obj1[arrIndex], obj2[j])) {
if (arrIndex !== j) {
obj2.splice(arrIndex, 0, obj2.splice(j, 1));
}
hasTheSame = true;
break;
}
}
if (!hasTheSame) {
return false;
}
}
return true;
} else {
return false;
}
} else {
return false;
}
}
上面代码没有对对象的方法,原型的属性方法等做判断。但是对于判断数据对象是否一样基本够用了。
如有不足,还请指正