java script 深度对象合并

由于公司最近的某个业务
顺手解决了一下,JS程序员,一直以来避之不及的问题。
那就是对象合并。
以及对象抽取。

var obj1 = {
    a: {
        h: [50, 1,2,3],
        j: "hehe"
    }
};

var obj2 = {
    a: {
        k: "KKK",
        h: [100, 2, 6],
        j: "haha"
    },
    b: {
        i: "abc"
    }
};

假设现在有这两个,js对象。
我们往往希望把他合并为,我们想要的样子,而不是简单的在第一层进行覆盖插入。

我们希望这个对象合并结果是这样:

{
    "a": {
        "h": [1,2,3,6,50,100],
        "j": "haha",
        "k": "KKK"
    },
    "b": {
        "i": "abc"
    }
}

大家可以在一下试一下

对象1

对象2

以下即是源码:

var margeObj = function (obj1, obj2) {
    this.arrayUnique = function(array){
        if (array instanceof Array === false) {
            throw "ARGEMENTS TYPE IS NOT ARRAY";
        }
        array.sort(function (a, b) {return a - b});
        var result = [array[0]];
        for(var i = 1; i < array.length; i++){
            if (result.indexOf(array[i]) === -1) {
                result.push(array[i]);
            }
        }
        return result;
    }

    this.jsonSortByKeys = function (json) {
        var keys = Object.keys(json);
        keys.sort();
        var result = {};
        for (var i = 0; i < keys.length; i++) {
            result[keys[i]] = json[keys[i]];
        }
        return result;
    };

    this.checkVarBothType = function (var1, var2) {
        if (var1 instanceof Array && var2 instanceof Array) {
            return "array";
        }
        if (var1 instanceof Array === false && var2 instanceof Array === false && var1 instanceof Object && var2 instanceof Object) {
            return "object";
        }
        if (var1 instanceof Function && var2 instanceof Function) {
            return "function";
        }
        if (var1 instanceof String && var2 instanceof String) {
            return "string";
        }
        if (var1 instanceof Number && var2 instanceof Number) {
            return "number";
        }
        if (var1 instanceof Boolean && var2 instanceof Boolean) {
            return "boolean";
        }
        return "different";
    };

    this.margeObjLoop = function (obj1, obj2) {
        if (checkVarBothType(obj1, obj2) !== 'object') {
            throw  "ARGEMENTS TYPE IS NOT OBJECT";
        }

        var cell1 = jsonSortByKeys(obj1);
        var cell2 = jsonSortByKeys(obj2);

        for (var i in cell2) {
            if (checkVarBothType(cell1[i], cell2[i]) == "array") {
                cell1[i] = arrayUnique(cell1[i].concat(cell2[i]));
                continue;
            }
            if (checkVarBothType(cell1[i], cell2[i]) == "object") {
                cell1[i] = jsonSortByKeys(margeObjLoop(cell1[i], cell2[i]));
                continue;
            }
            cell1[i] = cell2[i];
        }

        return jsonSortByKeys(cell1);
    };

    return this.margeObjLoop(obj1, obj2);
};

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注