您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

JavaScript趣题:深度比较对象

2024/3/20 21:32:26发布32次查看
在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趣题:深度比较对象的内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product