Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript从另一个JSON对象中填充一个JSON对象中缺少的键_Javascript_Json - Fatal编程技术网

JavaScript从另一个JSON对象中填充一个JSON对象中缺少的键

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]') {

我有一个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]') {
                if (!to.hasOwnProperty(key)) {
                    to[key] = {};
                }
                fillObject(from[key], to[key]);
            }
            else if (!to.hasOwnProperty(key)) {
                to[key] = from[key];
            }
        }
    }
}
当两个物体都有相同的结构时,它一直在工作。现在object1中的项目实际上可以出现在结构中的任何位置。object1object2的示例(由于我删除了所有不必要的键,所以结构可能看起来很有趣)

这就是我想要的结果:

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"
    }
];