Javascript 合并两个json字符串时出现问题
我试图使用在express下运行的deepextend()来合并两个对象。注意:我知道JSON 1和JSON 2在结构上的差异——这可能是我的问题的原因吗?两者都是通过对数据字符串执行JSON.parse创建的。我无法控制这些数据是如何呈现给我的,因此任何关于如何修复的建议都是值得赞赏的 JSON 1:Javascript 合并两个json字符串时出现问题,javascript,json,Javascript,Json,我试图使用在express下运行的deepextend()来合并两个对象。注意:我知道JSON 1和JSON 2在结构上的差异——这可能是我的问题的原因吗?两者都是通过对数据字符串执行JSON.parse创建的。我无法控制这些数据是如何呈现给我的,因此任何关于如何修复的建议都是值得赞赏的 JSON 1: { '0': { name: 'Car', level: '3', customname: 'Black', description: 'descripti
{ '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 } ]
考虑到,问题是第二个参数是数组。
deep-extend
的API(大部分未记录)是deep-extend(targetObject、sourceObject1、sourceObject2等)
。只有当源对象是非数组对象时,才会将其合并到目标中(请参见第100行)。以下是我在不使用deep extend模块的情况下的操作方法
首先重新排列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: {...} }
然后,在对象数组上循环。如果存在与名称
属性匹配的对象键,则覆盖从JSON1到JSON2的属性(如果存在)
for(变量i=0,l=arr1.length;i
权威数据集是JSON1还是JSON2?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];
}
}
}