手写深度比较 isEqual

105 阅读1分钟

实现效果

        const obj1 = {a: 10, b: {x: 100, y: 200}}
        const obj2 = {a: 10, b: {x: 100, y: 200}}
        isEqual(obj1, obj2) === true

实现代码

// 判断是否是对象或数组
function isObject(obj){
    return typeof obj === 'object' && obj !==null
}

//全相等(深度)
function isEqual(obj1, obj2){
    //如果obj1不是对象数组 或者 obj2不是对象数组,也就是说只要有一个不是对象数组,则直接进行比较
    if(!isObject(obj1) || !isObject(obj2)){
        // 值类型(注意,参与equal的一般不会是函数)
        return obj1 === obj2
    }
    //如果传入相同的参数
    if(obj1 === obj2){
        return true
    }
    //两个都是对象或数组,而且不相等
    //1.先取出obj1和obj2的keys,比较个数
    const obj1keys = Object.keys(obj1)
    const obj2keys = Object.keys(obj2)
    if(obj1keys.length !== obj2keys.length){
        return false
    }
    //2.以obj1为基准,和obj2依次递归比较
    for(let key in obj1){
        //比较当前key的val————递归!!!
        const res = isEqual(obj1[key], obj2[key])
        if(!res){
            return false
        }
    }

    //3.全相等
    return true

}

//测试数据
const obj1 = {
    a: 10,
    b: {
        x: 100,
        y: 200
    }
}
const obj2 = {
    a: 10,
    b: {
        x: 100,
        y: 200
    }
}
console.log(isEqual(obj1, obj2))