【问题标题】:How to add a JSON array to every JSON object in javascript?如何将 JSON 数组添加到 javascript 中的每个 JSON 对象?
【发布时间】:2016-07-18 00:26:24
【问题描述】:

我有以下JSON 对象:

{
  "status": "CREATED",
  "overrides": {
    "name": "test_override"
  },
  "package_name": "test",
  "name": "app1",
  "defaults": {
    "job": {
      "example": {
        "executors_num": "2",
        "freq_in_mins": "180",
        "executors_mem": "256M",
        "job_name": "batch_example"
      }
    }
  }
}

我想将上面的JSON 对象转换成这样的东西。基本上为每个嵌套对象添加一个数组

{
  "children": [
    {
      "status": "CREATED"
    },
    {
      "obj": "overrides",
      "children": [
        {
          "name": "test_override"
        }
        ]
        },
        {
          "package_name": "test"
        },
        {
          "name": "app1"
        },
        {
          "obj": "defaults",
          "children": [
          {
           "obj": "job",
           "children": [
           {
            "obj": "example",
            "children": [
            {
              "executors_num": "2",
              "freq_in_mins": "180",
              "executors_mem": "256M",
              "job_name": "batch_example"
            }]
          }]
        }]
      }
    ]
}

以下是我的代码:

function traverse(o, d) {
  for (i in o) {
    if (typeof(o[i])=="object") {
      console.log(i, o[i]);
      // considering only 'default' obj for now
      if(i === 'defaults') {
        d.children.push( {obj: i, "children" :[ o[i] ]});
      }
      traverse(o[i], d);
    }
  }
  return d;
}   

我最终得到了这个:

{"children":[{"obj":"defaults",
"children":[{"job":{"example":
{"executors_num":"2","freq_in_mins":"180","executors_mem":"256M","job_name":"batch_example"}}}]}]}

但我似乎很震惊,不知道如何将children 数组添加到每个嵌套对象。有什么指点吗?

【问题讨论】:

  • 究竟是什么问题?有任何错误消息吗?
  • 我无法弄清楚如何将数组添加到每个嵌套对象。我最终得到了这个:{"children":[{"obj":"defaults"},{"children":[{"job":{"example":{"executors_num":"2","freq_in_mins":"180","executors_mem":"256M","job_name":"batch_example"}}}]}]}
  • 请使用您评论中的代码更新您的示例。
  • @whipdancer 用代码更新了示例..
  • 你可以给任何 Fiddle/Pnlkr 做广告吗?

标签: javascript arrays angularjs json


【解决方案1】:

另一个提议为每个属性在 children 数组中添加一个自己的对象。

function organize(object, result, key) {
    if (typeof object === 'object') {
        result.obj = key;
        result.children = [];
        Object.keys(object).forEach(function (k) {
            var o = {};
            result.children.push(o);
            organize(object[k], o, k);
        });
    } else {
        result[key] = object;
    }
}

var object = { "status": "CREATED", "overrides": { "name": "test_override" }, "package_name": "test", "name": "app1", "defaults": { "job": { "example": { "executors_num": "2", "freq_in_mins": "180", "executors_mem": "256M", "job_name": "batch_example" } } } },
    newObject = {};

organize(object, newObject)
document.write('<pre>' + JSON.stringify(newObject, 0, 4) + '</pre>');

【讨论】:

    【解决方案2】:

    下面的代码是一个递归函数,它检查对象键是否是一个对象,如果是,则调用它自己

    var data = {
      "status": "CREATED",
      "overrides": {
        "name": "test_override"
      },
      "package_name": "test",
      "name": "app1",
      "defaults": {
        "job": {
          "example": {
            "executors_num": "2",
            "freq_in_mins": "180",
            "executors_mem": "256M",
            "job_name": "batch_example"
          }
        }
      }
    }
    
    function toArray(obj){
      var res = {children:[]}
       Object.keys(obj).forEach(function(key){
         var childObj = {};
         
          if(typeof obj[key] === 'object'){
            childObj[key] = toArray(obj[key])
          }
          else{
            childObj[key] = obj[key]  
          }
         res.children.push(childObj)
       })
       return res;
    }
    
    document.write(JSON.stringify(toArray(data)))

    【讨论】:

    • 不完全是我正在寻找的答案。它添加了一个单独的元素作为 JSON 对象。相反,它应该成为父数组的子元素。
    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2011-11-21
    • 2020-02-22
    • 1970-01-01
    • 2021-03-05
    • 2018-07-20
    • 2021-11-01
    相关资源
    最近更新 更多