从JSON中删除子项并仅使用父项生成JSON?

时间:2017-07-17 22:02:58

标签: javascript json

我得到了下一个JSON:

"thing":{ 
    "something":{
        "1":1,
        "2":2
    }
    "somethingelse":{
        "1":1,
        "2":2
    }
}

我想将JSON解析为:

"thing":{
    "something1": 1,
    "something2": 2,
    "somethingelse1": 1,
    "somethingelse2": 2,
}

正如您所看到的,结果元素的名称是父级和子级的串联。价值是孩子们的价值。任何人都可以帮助我如何在JavaScript中获得此功能?感谢。

2 个答案:

答案 0 :(得分:1)

如果只有一级嵌套属性,则可以使用嵌套循环来实现此目的:

var thing = { 
    "something":{
        "1":1,
        "2":2
    },
    "somethingelse":{
        "1":1,
        "2":2
    }
};

var newThing = {};

for (var key in thing) {
  for (var subKey in thing[key]) {
    newThing[key + subKey] = thing[key][subKey];
  }
}

console.log(newThing);

如果你有任意数量的级别,那么递归是可行的方法!

答案 1 :(得分:0)



  var jn = {
        "test": {
            "test": 1,
            "testx": 2,
            "xtest": {
                "x": 1,
                "y": 2
            },
            "test2": 1
        },
        "xx":{
            "x":2,
            "y": 3
        }
    };
  
  var flatJson = function(json, val, obj){
        var keys = Object.keys(json);
        
        for(var key in json){
            if(Object.keys(json[key]).length > 0){
                flatJson(json[key], val + key, obj);
            }
            else {
               obj[val + key] = json[key];
            }
        }

        return obj;
    }
    
    /* this is only as an example for your question, you could also call:
       flatJson(jn, "", {})  
    */

    var ret = flatJson(jn["test"], "", {});
    var out = {"test": ret }
    
    document.getElementById("out").innerHTML = JSON.stringify(out, undefined, 2);

<pre id="out" ></pre>
&#13;
&#13;
&#13;

jn [...]是一些测试数据。该函数将简单地遍历键,并且只有在没有键时它才会获取该值并将其添加到变量obj中。否则,它将使用附加到实际键的先前键的参数和将包含该对象的obj变量来递归调用flatJson。

由于数组没有为每个元素指定显式名称,因此它由索引隐式命名,默认情况下为js。

要将它用于你的问题 - 假设你的json被称为var js - 你可以用var out = flatJson(js["Thing"], "", {});然后var newJs = { "Thing" : out };来调用它,这会导致问题中的输出。

玩得开心。