JavaScript从另一个JSON对象中填充一个JSON对象中缺少的键
我有一个JSON对象object1,需要从object2填充缺少的字段-不应替换现有字段 我曾经使用过这个功能:JavaScript从另一个JSON对象中填充一个JSON对象中缺少的键,javascript,json,Javascript,Json,我有一个JSON对象object1,需要从object2填充缺少的字段-不应替换现有字段 我曾经使用过这个功能: function fillObject(from, to) { for (var key in from) { if (from.hasOwnProperty(key)) { if (Object.prototype.toString.call(from[key]) === '[object Object]') {
function fillObject(from, to) {
for (var key in from) {
if (from.hasOwnProperty(key)) {
if (Object.prototype.toString.call(from[key]) === '[object Object]') {
if (!to.hasOwnProperty(key)) {
to[key] = {};
}
fillObject(from[key], to[key]);
}
else if (!to.hasOwnProperty(key)) {
to[key] = from[key];
}
}
}
}
当两个物体都有相同的结构时,它一直在工作。现在object1中的项目实际上可以出现在结构中的任何位置。object1和object2的示例(由于我删除了所有不必要的键,所以结构可能看起来很有趣)
这就是我想要的结果:
var object1 = [
{
"position": 1,
"items": [
{
"position": 1, "itemId": 431, "title": "Title 1"
},
{
"position": 2, "itemId": 1162, "title": "Overwritten title"
}
]
},
{
"position": 2,
"groups": [
{
"position": 1,
"items": [
{
"position": 1, "itemId": 452, "title": "New title"
},
{
"position": 2, "itemId": 1388, "title": "Title 4"
},
{
"position": 3, "itemId": 1942, "title": "Title 5"
}
]
},
{
"position": 2, "itemId": 1942, "title": "Title 5"
},
{
"position": 3,
"items": [
{
"position": 1, "itemId": 431, "title": "Title 1"
},
{
"position": 2, "itemId": 2000
},
{
"position": 3, "itemId": 452, "title": "Title 2"
},
]
}
]
},
{
"position": 3, "itemId": 1388, "title": "Title 4"
},
{
"position": 4, "itemId": 2000, "title": "Extra title"
}
];
提前感谢您的帮助。如果您可以通过属性识别对象(比如
itemId
),您可以执行以下操作
- 将任务拆分为若干小子任务:复制缺少的属性、遍历对象结构、查找对象的对应源
- 将这些小功能块作为函数实现并一起使用
const defaults=(target,src)=>Object.keys(src)
.forEach(key=>key-in-target | |(target[key]=src[key]))
常量遍历=fn=>可遍历=>{
fn(可穿越)
const nested=Array.isArray(可遍历)?可遍历:Object.values(可遍历)
nested.filter(value=>typeof value==='object')
.forEach(导线(fn))
}
const fillById=id=>sources=>{
常量映射=新映射(sources.Map(item=>[item[id],item]))
返回obj=>{
const src=mapping.get(obj.itemId)
src&默认值(obj、src)
}
}
var object1=[
{
"立场":一,,
“项目”:[
{
“位置”:1,“项目ID”:431
},
{
“位置”:2,“项目ID”:1162,“标题”:“覆盖的标题”
}
]
},
{
"立场":二,,
“团体”:[
{
"立场":一,,
“项目”:[
{
“位置”:1,“项目ID”:452,“标题”:“新标题”
},
{
“位置”:2,“项目ID”:1388
},
{
“位置”:3,“项目ID”:1942
}
]
},
{
“位置”:2,“项目ID”:1942
},
{
“立场”:3,
“项目”:[
{
“位置”:1,“项目ID”:431
},
{
“位置”:2,“项目ID”:2000
},
{
“位置”:3,“项目ID”:452
}
]
}
]
},
{
“位置”:3,“项目ID”:1388
},
{
“职位”:4,“项目ID”:2000,“职位”:“额外职位”
}
];
var object2=[
{“itemId”:431,“title”:“title 1”},
{“itemId”:452,“title”:“title 2”},
{“itemId”:1162,“title”:“title 3”},
{“itemId”:1388,“title”:“title 4”},
{“itemId”:1942,“title”:“title 5”},
{“itemId”:2000}
];
遍历(fillById('itemId')(object2))(object1)
log(object1)
如果可以通过属性(比如itemId
)识别对象,则可以执行以下操作
- 将任务拆分为若干小子任务:复制缺少的属性、遍历对象结构、查找对象的对应源
- 将这些小功能块作为函数实现并一起使用
const defaults=(target,src)=>Object.keys(src)
.forEach(key=>key-in-target | |(target[key]=src[key]))
常量遍历=fn=>可遍历=>{
fn(可穿越)
const nested=Array.isArray(可遍历)?可遍历:Object.values(可遍历)
nested.filter(value=>typeof value==='object')
.forEach(导线(fn))
}
const fillById=id=>sources=>{
常量映射=新映射(sources.Map(item=>[item[id],item]))
返回obj=>{
const src=mapping.get(obj.itemId)
src&默认值(obj、src)
}
}
var object1=[
{
"立场":一,,
“项目”:[
{
“位置”:1,“项目ID”:431
},
{
“位置”:2,“项目ID”:1162,“标题”:“覆盖的标题”
}
]
},
{
"立场":二,,
“团体”:[
{
"立场":一,,
“项目”:[
{
“位置”:1,“项目ID”:452,“标题”:“新标题”
},
{
“位置”:2,“项目ID”:1388
},
{
“位置”:3,“项目ID”:1942
}
]
},
{
“位置”:2,“项目ID”:1942
},
{
“立场”:3,
“项目”:[
{
“位置”:1,“项目ID”:431
},
{
“位置”:2,“项目ID”:2000
},
{
“位置”:3,“项目ID”:452
}
]
}
]
},
{
“位置”:3,“项目ID”:1388
},
{
“职位”:4,“项目ID”:2000,“职位”:“额外职位”
}
];
var object2=[
{“itemId”:431,“title”:“title 1”},
{“itemId”:452,“title”:“title 2”},
{“itemId”:1162,“title”:“title 3”},
{“itemId”:1388,“title”:“title 4”},
{“itemId”:1942,“title”:“title 5”},
{“itemId”:2000}
];
遍历(fillById('itemId')(object2))(object1)
console.log(object1)
,如果您还不了解它们,可能会对您有所帮助。是否可以使用itemId
属性来唯一标识
var object1 = [
{
"position": 1,
"items": [
{
"position": 1, "itemId": 431, "title": "Title 1"
},
{
"position": 2, "itemId": 1162, "title": "Overwritten title"
}
]
},
{
"position": 2,
"groups": [
{
"position": 1,
"items": [
{
"position": 1, "itemId": 452, "title": "New title"
},
{
"position": 2, "itemId": 1388, "title": "Title 4"
},
{
"position": 3, "itemId": 1942, "title": "Title 5"
}
]
},
{
"position": 2, "itemId": 1942, "title": "Title 5"
},
{
"position": 3,
"items": [
{
"position": 1, "itemId": 431, "title": "Title 1"
},
{
"position": 2, "itemId": 2000
},
{
"position": 3, "itemId": 452, "title": "Title 2"
},
]
}
]
},
{
"position": 3, "itemId": 1388, "title": "Title 4"
},
{
"position": 4, "itemId": 2000, "title": "Extra title"
}
];