Rumah >hujung hadapan web >tutorial js > JavaScript趣题:深度比较对象

JavaScript趣题:深度比较对象

黄舟
黄舟asal
2017-01-22 14:38:091679semak imbas

在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)!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn