我目前正在使用以下代码:
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"}}}}
知道它为什么不起作用?
答案 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);