麻烦合并两个json字符串

时间:2015-12-14 05:31:43

标签: javascript json

我尝试使用在express下运行的深度扩展(found here)来合并几个对象。注意:我意识到JSON 1和JSON 2之间的结构差异 - 这可能是我的问题的原因吗?两者都是通过对一串数据执行JSON.parse来创建的。我无法控制这些数据是如何传达给我的,所以任何有关如何修复的建议都会受到赞赏。

JSON 1:

{ '0': 
   { name: 'Car',
     level: '3',
     customname: 'Black',
     description: 'description here',
     availableForUse: true } }

JSON 2:

[ { description: 'description here',
    name: 'Car',
    availableForUse: false,
    _id: 56679b6f9754083f0fa5ce94 },
  { description: 'desc',
    name: 'Truck',
    availableForUse: false,
    _id: 5667fb8e0c85cf6d279c2af1 },
  { description: 'desc',
    name: 'Boat',
    availableForUse: false,
    _id: 5667fcc2771155032839a8db },
  { description: 'desc',
    name: 'Train',
    availableForUse: false,
    _id: 5667fd32771155032839a8dc } ]

合并后的内容

{ '0': 
   { name: 'Car',
     level: '3',
     customname: 'Black',
     description: 'description here',
     availableForUse: true } }

我想要什么

[ { description: 'description here',
    name: 'Car',
    customname: 'Black',
    availableForUse: true,
    _id: 56679b6f9754083f0fa5ce94 },
  { description: 'desc',
    name: 'Truck',
    availableForUse: false,
    _id: 5667fb8e0c85cf6d279c2af1 },
  { description: 'desc',
    name: 'Boat',
    availableForUse: false,
    _id: 5667fcc2771155032839a8db },
  { description: 'desc',
    name: 'Train',
    availableForUse: false,
    _id: 5667fd32771155032839a8dc } ]

2 个答案:

答案 0 :(得分:1)

考虑到source of deep-extend,问题是你的第二个参数是一个数组。 deep-extend的(大部分未记录的)API是deep-extend(targetObject, sourceObject1, sourceObject2, ...)。如果源对象是非Array对象,则它们仅合并到目标中(参见第100行)。

答案 1 :(得分:0)

如果不使用深度扩展模块,我将如何做到这一点。

首先重新排列JSON1,以便每个对象的name属性成为对象键:

var obj1 = Object.keys(obj).reduce(function (p, c) {
  var o = obj[c], name = o.name;
  p[o.name] = JSON.parse(JSON.stringify(o));
  return p;
}, {});

输出

{ Car: {...} }

然后,循环遍历对象数组。如果存在与name属性匹配的对象键,则覆盖从JSON1到JSON2 的属性(如果它们存在)

for (var i = 0, l = arr1.length; i < l; i++) {
  var el = arr1[i], key = el.name;
  if (obj1[key]) {
    for (var p in el) {
     if (obj1[key][p]) el[p] = obj1[key][p];
    }
  }
}

DEMO