js 判断任意对象是否相等

JSON.stringify([{N:1}]) == JSON.stringify([{N: "1"}]) 结果为fasle

JSON.stringify([{N:1}]) === JSON.stringify([{N: "1"}])  结果为false

JSON.stringify([{N:1}]) === JSON.stringify([{N: 1}]) 结果为true

通过JSON.stringify 一些情况下无法 判断 ojb == obj是否正确

所以造了下面的方法进行判断

deep = false 执行的是 == 判断

deep=true 执行的是 === 判断

对于deep =true 的判断可以修改成 JSON.stringify 判断,但是对与未排序的数组会出现判断错误

function objIsEqual(obj1, obj2, deep = false) {
    let result = false;
    arrTransmit(obj1, obj2, deep);

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

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


    function isEqual(v1, v2, deep) {
        if (!deep) {
            if (v1 == v2) return true;
        } else {
            if (v1 === undefined && v2 === undefined) return true;
            if (v1 === null && v2 === null) return true;
            if (v1 === v2) return true;
        }
        return false;
    }

    function arrTransmit(obj1, obj2, deep, tag = 'value') {
        if (isArray(obj1) && isArray(obj2)) {
            if (obj1.length !== obj2.length) {
                return false;
            } else {
                let i;
                obj1.sort();
                obj2.sort();
                for (i = 0; i < obj1.length; i++) {
                    if (tag === 'key') {
                        if (arrTransmit(obj1[i], obj2[i], deep, 'key') !== 'key') {
                            result = false;
                            return false;
                        }

                    } else {
                        if (!arrTransmit(obj1[i], obj2[i], deep, 'value')) {
                            result = false;
                            return false;
                        }
                    }
                }
            }
        } else if (isObject(obj1) && isObject(obj2)) {
            if (!objTransmit(obj1, obj2, deep)) {
                return false;
            }
        } else {
            result = isEqual(obj1, obj2, deep);
            if(!result){
                return false;
            }
        }
        if (tag == 'key') {
            return 'key'
        } else {
            return true;
        }
    }

    function objTransmit(obj1, obj2, deep) {
        let k1 = Object.keys(obj1), k2 = Object.keys(obj2);
        let v1 = Object.values(obj1), v2 = Object.values(obj2);
        if (k1.length !== k2.length) {
            return false;
        }
        if (arrTransmit(k1.sort(), k2.sort(), deep, 'key') === 'key') {
            if (!arrTransmit(v1.sort(), v2.sort(), deep, 'value')) {
                return false;
            }
        } else {
            return false;
        }
        return true;
    }

    return result;
}

console.log(this.objIsEqual({house: [111, 222], device: [11, 22, 33, 44]}, {house: [111], device: [11]}))
console.log(this.objIsEqual({house: [111, 222], device: [11, 22, 33, 44]}, {
    house: [111, 222],
    device: [11, 22, 33, 44]
}))
console.log(this.objIsEqual(1, 1))
console.log(this.objIsEqual(null, undefined))
console.log(this.objIsEqual(1, '1', true))
console.log(this.objIsEqual([2, 3, 5], [5, 3, 2]))
console.log(this.objIsEqual([2, 3, 5], [5, 3, "2"], true))




猜你喜欢

转载自blog.csdn.net/github_38108899/article/details/88364352