使用javascript填充另一个JSON

使用javascript填充另一个JSON,javascript,json,foreach,Javascript,Json,Foreach,给定一个空JSON 1: JSON1 = { "person": { "firstName": "" }, "products": { "packName": "", "packSize": "" } } JSON 2的字段比JSON 1多: JSON2 = { "person": { "firstName": "Ahmed", "job": "Doctor" }, "products": { "packName": "antibiotic", "packSize": "lar

给定一个空JSON 1:

JSON1 = {
  "person": { "firstName": "" },
  "products": { "packName": "", "packSize": "" }
}
JSON 2的字段比JSON 1多:

JSON2 = {
  "person": { "firstName": "Ahmed", "job": "Doctor" },
  "products": { "packName": "antibiotic", "packSize": "large" }
}
我想用JSON 2中相应的值填充JSON 1

{
  "person": { "firstName": "Ahmed" },
  "products": { "packName": "antibiotic", "packSize": "large" }
}
我试过几种方法,但都没有达到目的

var newObj = {};
var parsedJson1 = JSON.parse(tw.local.JSON1);
var parsedJson2 = JSON.parse(tw.local.JSON2);
var i;

for (i in parsedJson1) {
    var key=i;
    var subkey=i;
    for (j in parsedJson2) {
        var k=j;
        var s=j;
        if (key == k && subkey == s) {
            newObj[key][subkey] = parsedJson2[j];
        }
    }
}
tw.local.stringifiedJSON = JSON.stringify(newObj);

下面是一个关于如何做到这一点的示例:

请注意,这假设如下:

  • 您知道第二个对象将具有所有必需的键
  • 第一级的所有值都是对象
  • 请注意,此解决方案仅适用于指定的结构,如果需要处理任何变化,则需要使其更具防御性
  • 步骤:

    • 迭代有效键(JSON1上的所有键)
    • 对于每个有效键,将其添加到
      newObj
      并在有效的
      子键上迭代
    • 将值从
      JSON2
      复制到
      newObj
    注意:我对你的代码做了一些修改,这样就可以在这个网站上执行了

    const JSON1=`{
    “人”:{“名字”:“},
    “产品”:{“packName”:“packSize”:”}
    }`;
    常量JSON2=`{
    “人”:{“名字”:“艾哈迈德”,“工作”:“医生”},
    “产品”:{“包装名称”:“抗生素”,“包装尺寸”:“大型”}
    }`;
    const parsedJson1=JSON.parse(JSON1);
    const parsedJson2=JSON.parse(JSON2);
    const newObj={};
    const validKeys=Object.keys(parsedJson1);
    for(让我看看Object.keys(parsedJson1)){
    if(newObj[i]==未定义){
    newObj[i]={};
    }
    for(设j为Object.keys(parsedJson1[i])){
    newObj[i][j]=parsedJson2[i][j];
    }
    }
    
    log(JSON.stringify(newObj))您应该使用递归遍历目标对象以获得健壮性。我格式化了代码以提高可读性

    function getNode(obj, path) {
        var ret = obj;
        try {
            // replace forEach with for-loop for browser compatibilities
            path.forEach(function (p) {
                ret = ret[p];
            });
        } catch (e) {
            return undefined;
        }
        return ret;
    }
    
    function fillJSONWithAnother(target, source, path) {
        if (!(target && source)) return target;
        // Assign path as an empty array for first call
        path = path || [];
    
        // Get target node and source node for comparing
        var targetValue = getNode(target, path);
        var sourceValue = getNode(source, path);
        // targetValue is not a leaf node (i.e. is Object), should traverse its children nodes
        if (targetValue && typeof targetValue === "object") {
            for (var key in targetValue) {
                fillJSONWithAnother(target, source, path.concat([key]));
            }
        }
        // targetValue is a leaf node (i.e. not Object) and source value exists, set corresponding value
        else if (sourceValue !== undefined) {
            var node = getNode(target, path.slice(0, path.length - 1));
            node[path[path.length - 1]] = sourceValue;
        }
        return target;
    }
    
    // Test case
    var obj1 = {
        "person": {
            "firstName": ""
        },
        "products": {
            "packName": "",
            "packSize": "l"
        }
    };
    var obj2 = {
        "person": {
            "firstName": "Ahmed",
            "job": "Doctor"
        },
        "products": {
            "packName": "antibiotic",
            "packSize": "large"
        }
    }
    fillJSONWithAnother(obj1, obj2);
    // {"person":{"firstName":"Ahmed"},"products":{"packName":"antibiotic","packSize":"large"}}
    

    变量k,s,key和subkey的值是多少,您没有初始化它们if条件如何工作?key=i和k=j