js判断两个对象是否相等(不是指针地址相同)

2020-03-08  本文已影响0人  指尖跳动

方法一:

    function isObject(obj){
        return Object.prototype.toString.call(obj)==='[object Object]'
    }

    function isArray(arr){
        return Object.prototype.toString.call(arr)==='[object Array]'
    }

    function equalsObj(obj1,obj2){
        if(obj1 === obj2) return true

        if(isObject(obj1) && isObject(obj2) && Object.keys(obj1).length===Object.keys(obj2).length){

            for(const key in obj1){
                if(obj1.hasOwnProperty(key)){
                    if(!equalsObj(obj1[key],obj2[key])){
                        return false
                    }
                }
            }
        }else if(isArray(obj1) && isArray(obj2) && obj1.length ===obj2.length){
            for(let i=0; i<obj1.length; i++){
                if(!equalsObj(obj1[i],obj2[i])){
                    return false
                }
            }
        }else {
            return false
        }
        return true
    }

测试用例

    var arr1 = [1,2,
        [
            {
                name:"张三",
                age:11,
            }
        ],
        {
            name:'李四',
            age:21,
            em:[
                {
                    address:'石家庄',
                    phone:'152'
                },
                {
                    address:'北京',
                    phone:234
                }
            ]
        }
    ];
    var arr2 = [1,2,
        [
            {
                name:"张三",
                age:11
            }
        ],
        {
            name:'李四',
            age:21,
            em:[
                {
                    address:'石家庄',
                    phone:'152'
                },
                {
                    address:'北京',
                    phone:234
                }
            ]
        }
    ];

    console.log(equalsObj(arr1,arr2));2));

方法二:

    function diff(obj1,obj2){
        var o1 = obj1 instanceof Object;
        var o2 = obj2 instanceof Object;
        if(!o1 || !o2){/*  判断不是对象  */
            return obj1 === obj2;
        }

        if(Object.keys(obj1).length !== Object.keys(obj2).length){
            return false;
            //Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2;
        }

        for(var attr in obj1){
            var t1 = obj1[attr] instanceof Object;
            var t2 = obj2[attr] instanceof Object;
            if(t1 && t2){
                return diff(obj1[attr],obj2[attr]);
            }else if(obj1[attr] !== obj2[attr]){
                return false;
            }
        }
        return true;
    }
上一篇 下一篇

猜你喜欢

热点阅读