编辑代码

let def = {
    "l1": 'abc',
    // "l2": [1, 2, 3],
    "l3": {
        l3_a: false,
        l3_b: ['1', 123]
    },
    "l4": true,
    "l6": [
        {
            l6_a: true,
            l6_b: [1, 2, 3],
        }
    ],
}

let b = {
    // "l1": 'abc',
    // "l2": [1, 2, 3],
    "l3": {
        l3_a: false,
        l3_b: ['1', 123]
    },
    "l4": true,
    "l6": [
        {
            l6_a: true,
            l6_b: [1, 2, 3],
        }
    ],
}

const isEmpty = (str) => {
    if (!str) {
        return true;
    } else if (typeof str === 'object' && Object.keys(str).length === 0) {
        return true;
    } else if (typeof str === 'string' && str.replace(/(^\s*)|(\s*$)/g, '').length === 0) {
        return true;
    }
    return false;
};

const compArray = (array1, array2) => {
    if ((array1 && typeof array1 === 'object' && array1.constructor === Array) &&
        (array2 && typeof array2 === 'object' && array2.constructor === Array)) {
        if (array1.length == array2.length) {

            let flag = true;

            for (let i = 0; i < array1.length; i++) {

                if (typeof array1[i] === 'string' && typeof array2[i] === 'string') {
                    flag = array1[i] === array2[i]
                } else if (typeof array1[i] === 'number' && typeof array2[i] === 'number') {
                    flag = array1[i] === array2[i]
                } else if (typeof array1[i] === 'boolean' && typeof array2[i] === 'boolean') {
                    flag = array1[i] === array2[i]
                } else if (typeof array1[i] === 'object' && typeof array2[i] === 'object') {
                    flag = isEmpty(compObj(array1[i], array2[i]))
                }
            }
            return flag;
        } else {
            return false;
        }
    } else {
        throw new Error('argunment is error ;');
    }
    return true;
};

//比较两个对象是否相等,不包含原形上的属性计较
const compObj = (obj1, obj2) => {
    if ((obj1 && typeof obj1 === 'object') && ((obj2 && typeof obj2 === 'object'))) {
        for (let ob in obj1) {
            try {
                // if ((obj1[ob] && !obj2[ob]) || (!obj1[ob] && obj2[ob])) {
                //     // delete obj1[ob];
                //     delete obj2[ob];
                //     return obj2;
                // }
                if (obj1.hasOwnProperty(ob) && obj2.hasOwnProperty(ob)) {
                    //如果属性是数组
                    if (obj1[ob].constructor == Array && obj2[ob].constructor == Array) {

                        let abc = compArray(obj1[ob], obj2[ob])
                        // console.log('----', abc, obj1[ob], obj2[ob])
                        if (abc) {
                            delete obj2[ob];
                        }
                    } else if (typeof obj1[ob] === 'string' && typeof obj2[ob] === 'string') {
                        //纯属性
                        if (obj1[ob] === obj2[ob]) {
                            // delete obj1[ob];
                            delete obj2[ob];
                            // return false;
                        }
                    } else if (typeof obj1[ob] === 'number' && typeof obj2[ob] === 'number') {
                        //纯数字
                        if (obj1[ob] === obj2[ob]) {
                            // delete obj1[ob];
                            delete obj2[ob];
                            // return false;
                        }
                    } else if (typeof obj1[ob] === 'boolean' && typeof obj2[ob] === 'boolean') {
                        // console.log('boolean----')
                        //布尔值
                        if (obj1[ob] === obj2[ob]) {
                            // delete obj1[ob];
                            delete obj2[ob];
                            // return false;
                        }
                    } else if (typeof obj1[ob] === 'object' && typeof obj2[ob] === 'object') {
                        //属性是对象
                        // console.log('对象---', obj1[ob], obj2[ob])
                        if (isEmpty(compObj(obj1[ob], obj2[ob]))) {
                            delete obj2[ob];
                        }
                    } else {
                        if (obj1[ob] === obj2[ob]) {
                            // delete obj1[ob];
                            delete obj2[ob];
                            console.log('else-1--');
                            // return false;
                        }
                    }
                } else {
                    if (obj1[ob] === obj2[ob]) {
                        // delete obj1[ob];
                        delete obj2[ob];
                        console.log('else-2--');
                        // return false;
                    }
                }
            } catch (e) {
                // console.log({ob,obj1,obj2})
            }
        }
    }

    return obj2;
};

console.log(JSON.stringify(compObj(def, b)))