我尝试使用在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 } ]
答案 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];
}
}
}