在JavaScript中比较两个对象不是件轻松的活儿,而且它本身并没有提供这样的API。
如果你想用"=="运算符来比较两个对象,那就大错特错了。
"=="运算符只有在左右两边的变量指向同一个对象的时候,才会返回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.php.cn)!