时间:2021-07-01 10:21:17 帮助过:3人阅读
如果你想用"=="运算符来比较两个对象,那就大错特错了。
"=="运算符只有在左右两边的变量指向同一个对象的时候,才会返回true。
譬如如下的例子,就肯定会返回false。
var a = { name: 'Joe' };
var b = { name: 'Joe' };
a == b; //-> false那么咋们比较两个对象的标准是什么呢?
1.它们是否有同样的属性名
2.它们是否有同样的属性值
比如上面的a,b两个对象,它们都有为“name”的属性名,都有为“Joe”的属性值,所以就可以说,它们是“相似的”。
换句话说,我们此次的目的,是判断,两个JS对象是否是“相似的”。
上面的两个对象都很简单,如果我们遇到对象嵌套对象的情况,就会变得复杂起来。
因为对象的类型有很多种,比如正则对象,函数对象,日期对象,对它们的比较会增加程序复杂程度,因此,在这里我们只考虑几种情况:普通对象({}),数组对象([])和简单基本类型(string,number,boolean,null,undefined)。
即使简化了需求,完成这个比较相似也不是件容易的事儿,在下面我用到了深度遍历对象,逐一比较对象的属性名和值。
function deepCompare(o1, o2) {
//标识是否相似
var flag = true;
var traverse = function(o1,o2){
//如果至少有一个不是对象
if(!(o1 instanceof Object) || !(o2 instanceof Object)){
if(o1 !== o2){
flag = false;
}
return;
}
//如果两个对象的属性数量不一致
//比如:
//a:{name:"Jack",age:22}
//b:{name:"Jack"}
if(Object.keys(o1).length != Object.keys(o2).length){
flag = false;
}
//若有不同之处,尽早结束递归
if(flag){
//深度遍历对象
for(var i in o1){
//若都是对象,继续递归
if(typeof o1[i] === "object" && typeof o2[i] === "object"){
traverse(o1[i],o2[i]);
}//若都不是对象,则比较值
else if(typeof o1[i] !== "object" && typeof o2[i] !== "object"){
if(o1[i] !== o2[i]){
flag = false;;
}
}//一个是对象,一个不是对象,肯定不相似
else{
flag = false;
}
}
}
};
traverse(o1,o2);
return flag;
};以上就是 JavaScript趣题:深度比较对象的内容,更多相关内容请关注PHP中文网(www.gxlcms.com)!