关于javascript:基于Keys的JSON到JSON复制

JSON to JSON Copy based on Keys

本问题已经有最佳答案,请猛点这里访问。

所以我有两个JSON文件,我想浏览其中一个文件,将第二个JSON文件中的所有值匹配到匹配的键中。

例如,假设我

1
2
3
4
var json1 = {val1: 1, val2:2, val3:3};
var json2 = {val1: 52, val2:56, val7: 7, val5: 5, val3:33};

parseandmatchjson(json1, json2) => {val1: 1, val2:2, val7: 7, val5: 5, val3:3};

因此,基本上将第一个JSON中的所有键与第二个JSON中的所有键匹配,并替换这些值。

有图书馆吗?或者,如果你能给我一个例子,说明如何在JavaScript中做到这一点,我们将非常感激。谢谢您。

编辑:我应该更具体地说,我要找的是在结构不一定相同的情况下起作用的东西,

例如

假设我有

1
2
3
4
var json1 = {wrapper:
    {val1: 1, val2: 2}
}
var json2 = {val1: 'without wrapper'}

我还能在外面找个图书馆吗?

1
{wrapper: {val1: 'without wrapper', val2:2}}


如果不使用jquery,请执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function parseandmatchjson(json1, json2) {

    var combined_json = {};

    // Deep copy of json1 object literal
    for (var key in json1) {
        combined_json[key] = json1[key];
    }

    // Copy other values from json2
    for (var key in json2) {
        if (! json1.hasOwnProperty(key))
            combined_json[key] = json2[key];
    }

    return combined_json;
}

var json1 = {val1: 1, val2:2, val3:3};
var json2 = {val1: 52, val2:56, val7: 7, val5: 5, val3:33};
var json3 = parseandmatchjson(json1, json2);

如果您正在使用jquery,它会更简单

1
2
3
var json1 = {val1: 1, val2:2, val3:3};
var json2 = {val1: 52, val2:56, val7: 7, val5: 5, val3:33};
var json3 = $.extend({}, json2, json1);


编辑

根据采购订单的更新问题,这里是其更新的解决方案,以涵盖嵌套文本案例。

仅供参考,在下一个解决方案中,我假设您不使用jquery,因为您没有在问题中指定它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function parseandmatchjson(json1, json2) {

    // private function to traverse json objects recursively
    function traverse(object, callback) {
        for (var key in object) {
            // only return leaf nodes
            if((/boolean|number|string/).test(typeof object[key]))
                callback.apply(this, [object, key, object[key]]);  
            // if not base condition, dig deeper in recursion
            if (object[key] !== null && typeof(object[key]) =="object")
                traverse(object[key], callback);
        }
    }

    // create deep clone copy of json1
    var result = JSON.parse(JSON.stringify(json1));

    // create a flattened version of json2 for doing optimized lookups
    var flat_json2 = {};
    traverse(json2, function(object, key,value) {
        flat_json2[key] = value;
    });

    // overwrite values in results, if they exist in json2
    traverse(result, function(object, key, value) {
        if(typeof flat_json2[key] !=="undefined" )
            object[key] =  flat_json2[key];
    });

    return result;    
}


// Now, lets test it
var json1 = {wrapper: {val1: 1, val2: 2}}
var json2 = {val1: 'without wrapper'}
var merged_json = parseandmatchjson(json1, json2);

// check the result with a simple alert
alert(JSON.stringify(merged_json));

这是一个jsFiddle示例单击这里