天天看點

全相等函數 isEqual

// 判斷obj是否為對象
function isObject(obj) {
    return (typeof obj === 'object' && obj !== null);
}

//全相等函數
function isEqual(obj1,) {
    //如果其中一個不為對象,則判斷兩個是否嚴格相等
    if (!isObject(obj1) || !isObject(obj2)) {
        return obj1 === obj2;
    }

    // 到了這裡說明兩個都是對象
    // 先判斷引用是否相等
    if (obj1 === obj2) {
        return true;
    }

    //判斷兩個對象中的鍵的個數是否相同
    if (Object.keys(obj1).length !== Object.keys(obj2).length) {
        return false;
    }

    // 以obj1 為基準,遞歸判斷obj1和obj2中的元素是否相等
    for (let key in obj1) {
        const res = isEqual(obj1[key], obj2[key]);
        // 一層層遞歸比較,隻要有一項不同,就中斷并傳回false
        if (!res) {
            return false;
        }
    }

    // 遞歸比較全相等
    return true;
}


const obj1 = {
    a: 1,
    b: {
        x: 'aa',
        y: 'bb',
        z: 'cc'
    },
    c: [1, 2, 3]
}
const obj2 = {
    a: 1,
    b: {
        x: 'aa',
        y: 'bb',
        z: 'cc'
    },
    c: [1, 2, 3]
}

console.log(isEqual(obj1, obj2)); // true