判斷兩個(gè)對(duì)象是否相等

由于對(duì)象是引用類型,即使內(nèi)容一摸一樣的兩個(gè)對(duì)象,判斷他們是否相等也是不等的,他們是存在不同地址中的相同內(nèi)容,是不相等的;只有通過賦值,兩個(gè)對(duì)象指向的是同一個(gè)地址,同一個(gè)內(nèi)容,這樣才相等。


image.png

那js中判斷對(duì)象是否相等的方法有哪些呢?

  • JSON.stringify()
    首先,我們可以通過將對(duì)象通過JSON.stringify()方法將對(duì)象轉(zhuǎn)換成字符串,然后再比較
    局限性:
    如果對(duì)象里屬性的位置發(fā)生變化,轉(zhuǎn)換來的字符串就不相等,但實(shí)際我們只需要看他們的內(nèi)容是否一致,與順序沒有關(guān)系,所以這種方法有局限性。
  • 通用方法:
function equals(x,y){
    var f1=x instanceof Object;
    var f2=y instanceof Object;
    if(!f1 || !f2){
        return x===y
    }
    if(Object.keys(x).length!== Object.keys(y).length){
        return false
    }
    for(var p in x){
        var a= x[p] instanceof Object; 
        var b= y[p] instanceof Object; 
        if(a && b){
            equals(x[p],y[p])
        }else if(x[p]!=y[p]){
            return false;
        }
    }
      return true;
}
console.log(equals({a:1,b:2},{a:1,b:{c:4}}))

首先判斷是不是引用類型的,如果有一個(gè)不是,那就進(jìn)行直接判斷。
若全是引用類型的,那就先看一下屬性值的長度是否相等,若不相等,就直接false啦。
若相等,就接著遍歷里邊的每一個(gè)屬性,還是先看里邊的屬性是哪一個(gè)類型,如果全是引用類型,那就接著對(duì)里邊的屬性調(diào)用equals遞歸函數(shù)。如果不全是引用類型,那就比較這兩個(gè)值是否相等,若不相等就直接false啦。
若遍歷一圈下來都沒有返回false,說明都相等啦。所以返回true。

注意,最好不要用forin循環(huán),因?yàn)樗麜?huì)遍歷原型鏈所有的可枚舉屬性,而
function equals(x,y){
    var f1=x instanceof Object;
    var f2=y instanceof Object;
    if(!f1 || !f2){
        return x===y
    }
    if(Object.keys(x).length!== Object.keys(y).length){
        return false
    }
    Object.keys(x).forEach((p)=>{
        var a= x[p] instanceof Object; 
        var b= y[p] instanceof Object; 
        console.log(y[p])
        if(a && b){
            equals(x[p],y[p])
        }else if(x[p]!=y[p]){
            return false;
        }

    })
      return true;
    
}

但是forEach里的return不會(huì)終止循環(huán),所以還是不用forEach了,

function equals(x, y) {
        var f1 = x instanceof Object;
        var f2 = y instanceof Object;
        if (!f1 || !f2) {
            return x === y
        }
        if (Object.keys(x).length !== Object.keys(y).length) {
            return false
        }
        var newX = Object.keys(x);
        for (var p in newX) {
            p = newX[p];
            var a = x[p] instanceof Object;
            var b = y[p] instanceof Object;
            if (a && b) {
                equals(x[p], y[p])
            } else if (x[p] != y[p]) {
                return false;
            }
        }
        return true;

    }
    console.log(equals({ a: 1, b: 2 }, { a: 1, d: 2 }))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容