【问题标题】:JSON to JSON Copy based on Keys [duplicate]基于键的 JSON 到 JSON 复制 [重复]
【发布时间】:2014-12-19 07:37:04
【问题描述】:

所以我有两个 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}}

【问题讨论】:

  • 几乎每个库都会为您合并两个对象。 jQuery 中的 $.extend 和 Underscore 中的 _.extend 供初学者使用。
  • 那不是 JSON……那些只是对象字面量。
  • 这是一个静态文字对象结构吗?或者它可以是任何以叶键/值对结尾的结构,称为 val1, val2 ... ?
  • @hthomos ... 根据您更新的问题更新答案,如果解决了问题,请将其标记为答案
  • @Felix_Kling ...顺便说一句,这不是一个重复的问题。

标签: javascript json object key transform


【解决方案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

【讨论】:

  • 什么是$?假设它是 jQuery,你为什么不直接做 combined_json = $.extend({}, json2, json1);
  • 对不起,我提出了一个没有 jquery 的解决方案,但我忘记了并用 jquery 实现了一部分,已更正。
  • 如果它们不是相同的结构怎么办,假设我有 {val-wrapper: {val1:1}} 和 {val1: 52} 会做 $.extend({}, json2, json1 ) 给我 {val-wrapper:{val1: 52} ?
  • 不,它会给你 {"val1":52,"val_wrapper":{"val1":1}}
  • @hthomos,根据您更新的问题更新答案。 PS,如果解决了你的问题,请标记为答案
猜你喜欢
  • 1970-01-01
  • 2012-09-29
  • 2020-01-27
  • 1970-01-01
  • 2011-04-30
  • 2013-04-30
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多