【问题标题】:How can i merge two nested javascript objects?如何合并两个嵌套的 javascript 对象?
【发布时间】:2017-03-09 00:08:32
【问题描述】:

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

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"}}}}

知道为什么它不起作用吗?

【问题讨论】:

  • 结果应该是什么样子?

标签: javascript jquery object merge


【解决方案1】:

尝试将您的扩展函数更改为:$.extend(true, tempList, json);,它应该允许深度合并

【讨论】:

  • @Phil 是的,我使用的文档,谢谢添加
  • 看起来教师被覆盖,而不是合并:jsfiddle.net/32haeup2/1
  • 结合如何?什么是“预期”的结合方式?这个问题在这方面是模糊的。如果facultades 打算成为一个数组或其他东西,那么为什么不把paginas 也变成一个数组呢?组合与覆盖的启发式方法是什么?
  • @Santi 我不明白,你介意解释一下吗?
【解决方案2】:

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

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

要正确合并数组,我们可以使用$.merge 函数,但这仅适用于数组。由于您手头有一个 JSON 对象,因此这是行不通的。

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

希望您发现这对实现您想要的有用(cmets 中的解释):

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);

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 2012-12-01
    • 2012-11-30
    • 2018-06-25
    相关资源
    最近更新 更多