我需要一个已经通过2个json的函数,返回1个json,它是两者的融合但没有重叠它们。这是一个例子:
var json1 = { a: {x:1, y:2} , b: {x:1, y:2} }
var json2 = { a: {z:3}, c: {z:3, h:4} }
var result = magicFunctionINeed(json1, json2);
//result should be => {a:{x:1, y:2, z:3}, b: {x:1, z:2}, c: {z:3, h:4} }
我需要magicFunctionINeed()。我试过没有结果。 谢谢!
答案 0 :(得分:2)
您可以使用reduce
函数并循环json对象的键。
var json1 = { a: { x: 1, y: 2 }, b: { x: 1, y: 2 } };
var json2 = { a: { z: 3 }, c: { z: 3, h: 4} };
Object.keys(json2).reduce((a, o) => {
if (a[o]) {
a[o] = {...a[o], ...json2[o]};
} else {
a[o] = json2[o];
}
return a;
}, json1);
console.log(json1);
答案 1 :(得分:1)
您可以使用reduce()
方法创建自定义函数并返回新对象。请注意,这仅适用于嵌套对象和数组的一个级别。
var json1 = { a: {x:1, y:2} , b: {x:1, y:2}, g: [1, 2]}
var json2 = { a: {z:3}, c: {z:3, h:4}, g: [3], r: 123}
const merge = (...args) => {
return args.reduce(function(r, o) {
Object.keys(o).forEach(function(k) {
if (typeof o[k] == 'object' && !Array.isArray(o[k])) r[k] = Object.assign({}, r[k], o[k])
else if (Array.isArray(o[k])) r[k] = (r[k] || []).concat(o[k])
else r[k] = o[k]
})
return r;
}, {})
}
console.log(merge(json1, json2))
答案 2 :(得分:0)
您可以创建一个通用函数,可以将多个对象作为参数,并使用map
function mergeObj()
{
var output = {};
Array.from( arguments ).forEach( function( json ){
Object.keys( json ).forEach( function( key ){
output[ key ] = output[ key ] || {};
Object.assign( output[ key ], output[ key ], json[ key ] ); //set the new keys inside output[key]
});
});
return output;
}
<强>演示强>
var json1 = { a: {x:1, y:2} , b: {x:1, y:2} };
var json2 = { a: {z:3}, c: {z:3, h:4} };
function mergeObj()
{
var output = {};
Array.from( arguments ).forEach( function( json ){
Object.keys( json ).forEach( function( key ){
output[ key ] = output[ key ] || {};
Object.assign( output[ key ], output[ key ], json[ key ] );
});
});
return output;
}
console.log( mergeObj( json1, json2 ) );
注意强>
只有深度,它不会合并嵌套属性值比传递对象的直接属性更深。