如何将2个JSON与相同值融合而不重叠

时间:2018-02-01 12:26:21

标签: javascript json

我需要一个已经通过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()。我试过没有结果。 谢谢!

3 个答案:

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

注意

只有深度,它不会合并嵌套属性值比传递对象的直接属性更深。