我如何合并两个嵌套的JavaScript对象?

时间:2017-03-09 00:08:32

标签: javascript jquery object merge

我目前正在使用以下代码:

function mergeFaculty(json){
    tempList = $.extend(tempList, json);
    console.log(JSON.stringify(tempList));
}

然而,它不起作用。

对象如下:

{"modulos":{"id":"1","name":" Usuarios","paginas":{"id":"1","name":" Listado Usuarios","facultades":{"id":"1","name":" ver"}}}}

{"modulos":{"id":"1","name":" Usuarios","paginas":{"id":"1","name":" Listado Usuarios","facultades":{"id":"2","name":" editar"}}}}

知道它为什么不起作用?

2 个答案:

答案 0 :(得分:2)

尝试将扩展功能更改为:$.extend(true, tempList, json);,它应允许深度合并

答案 1 :(得分:0)

首先,我认为您的对象结构存在问题,因为您的facultades键是一个对象而不是一个数组。如果您希望在扩展名后同时保留facultades个对象,则应使用数组。

也就是说,似乎$.extend甚至覆盖了数组,这意味着它将选择作为该函数的参数传递的最新对象的数组。所以这对你不好,因为数组仍会保留facultades中的两个对象之一。

为了正确合并数组,我们可以使用$.merge函数,但这只适用于数组。由于您手头有一个JSON对象,因此无效。

因此,我所做的只是编写自己的递归代码来利用这两个特性:深层复制扩展函数和数组情况下的合并函数。

希望您发现这对实现您想要的内容很有用(评论中的解释):

var tempList = {"modulos":{"id":"1","name":" Usuarios","paginas":{"id":"1","name":" Listado Usuarios","facultades":[{"id":"1","name":" ver"}]}}}
var secondObject = {"modulos":{"id":"1","name":" Usuarios","paginas":{"id":"1","name":" Listado Usuarios","facultades":[{"id":"2","name":" editar"}]}}}

// Deep extend recursive function
function deepExtend(firstObject, secondObject, tempObject) {
    tempObject = typeof tempObject === "undefined" ? {} : tempObject;

    // Flattens multidimensional arrays
    function flatten(array) {
        if (array.length) {
            return array.reduce(function(prev, cur) {
                return prev.concat(cur)
            })
        }
    }
    // Iterates over both object, extends and merges them
    function iterateObjects(object1, object2) {
        var keys = Object.keys(object1);
        for (var i = 0; i < keys.length; i++) {
            var key = keys[i];
            var firstObjectValue = object1[key];
            var secondObjectValue = object2[key];

            if (firstObjectValue.constructor === Array) {
                tempObject[key] = []
                // Flatten arrays from each object
                flatten(firstObjectValue) ? tempObject[key].push(flatten(firstObjectValue)) : null;
                flatten(secondObjectValue) ? tempObject[key].push(flatten(secondObjectValue)) : null;

            } else if (firstObjectValue.constructor === Object) {
                tempObject[key] = deepExtend(firstObjectValue, secondObjectValue, {})
            } else {
                tempObject[key] = object2[key] || object1[key]
            }
        }
        return tempObject;
    }
    // Extend in both orders to find unique keys that appear only in one object
    tempObject = iterateObjects(firstObject, secondObject, tempObject);
    tempObject = iterateObjects(secondObject, firstObject, tempObject);

    return tempObject;
}


function mergeFaculty(json) {
    //tempList = $.merge(  tempList, json);
    tempList = deepExtend(tempList, json);
    console.log(JSON.stringify(tempList));
}

mergeFaculty(secondObject);