javascript 更改嵌套 JSON 结构中的键名

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13518762/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-26 19:01:31  来源:igfitidea点击:

Change key name in nested JSON structure

javascriptjson

提问by user1842231

I have a JSON data structure as shown below:

我有一个 JSON 数据结构,如下所示:

{
    "name": "World",
    "children": [
      { "name": "US",
          "children": [
           { "name": "CA" },
           { "name": "NJ" }
         ]
      },
      { "name": "INDIA",
          "children": [
          { "name": "OR" },
          { "name": "TN" },
          { "name": "AP" }
         ]
      }
 ]
};

I need to change the key names from "name" & "children" to say "key" & "value". Any suggestion on how to do that for each key name in this nested structure?

我需要将键名从“名称”和“孩子”更改为“键”和“值”。关于如何针对此嵌套结构中的每个键名执行此操作的任何建议?

回答by I Hate Lazy

I don't know why you have a semicolon at the end of your JSON markup (assuming that's what you've represented in the question), but if that's removed, then you can use a reviver functionto make modifications while parsing the data.

我不知道为什么你的 JSON 标记末尾有一个分号(假设这就是你在问题中所表示的),但如果它被删除,那么你可以使用reviver 函数在解析数据时进行修改。

var parsed = JSON.parse(myJSONData, function(k, v) {
    if (k === "name") 
        this.key = v;
    else if (k === "children")
        this.value = v;
    else
        return v;
});

DEMO:http://jsfiddle.net/BeSad/

演示:http ://jsfiddle.net/BeSad/

回答by Denys Séguret

You could use a function like this :

你可以使用这样的函数:

function clonerename(source) {
    if (Object.prototype.toString.call(source) === '[object Array]') {
        var clone = [];
        for (var i=0; i<source.length; i++) {
            clone[i] = goclone(source[i]);
        }
        return clone;
    } else if (typeof(source)=="object") {
        var clone = {};
        for (var prop in source) {
            if (source.hasOwnProperty(prop)) {
                var newPropName = prop;
                if (prop=='name') newPropName='key';
                else if (prop=='children') newPropName='value';
                clone[newPropName] = clonerename(source[prop]);
            }
        }
        return clone;
    } else {
        return source;
    }
}

var B = clonerename(A);

Note that what you have isn't a JSON data structure (this doesn't exist as JSON is a data-exchange format) but probably an object you got from a JSON string.

请注意,您拥有的不是 JSON 数据结构(这不存在,因为JSON 是一种数据交换格式),而可能是您从 JSON 字符串中获得的对象。

回答by loganfsmyth

Try this:

试试这个:

function convert(data){
  return {
    key: data.name,
    value: data.children.map(convert);
  };
}

Or if you need to support older browsers without map:

或者,如果您需要支持没有地图的旧浏览器:

function convert(data){
  var children = [];
  for (var i = 0, len = data.children.length; i < len; i++){
    children.push(convert(data.children[i]));
  }

  return {
    key: data.name,
    value: children
  };
}