所以我有两个json文件,我想通过其中一个,并将第二个json文件中的所有值匹配到匹配的键中。
例如,假设我有
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中完成这项工作,我将非常感激。谢谢。
编辑: 我应该更具体一点,我正在寻找的是当结构不一定相同的时候,
例如
假设我有
var json1 = {wrapper:
{val1: 1, val2: 2}
}
var json2 = {val1: 'without wrapper'}
我还能得到像某些图书馆那样的东西吗?
{wrapper: {val1: 'without wrapper', val2:2}}
答案 0 :(得分:1)
如果您不使用jquery,请按以下步骤操作:
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,那就更简单了
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);
修改强>
根据PO的更新问题,这是其更新的解决方案,涵盖嵌套文字案例
FYA,在下一个解决方案中,我假设你不使用jQuery,因为你没有在你的问题中指明这个
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示例click here