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示例单击这里