【问题标题】:How to iterate over items in object/array, and build a nested JSON?如何迭代对象/数组中的项目,并构建嵌套 JSON?
【发布时间】:2016-04-07 13:19:54
【问题描述】:

我正在处理一些 JSON 数据,我需要从一个对象中获取数据,并构建一个 JSON 对象。

已编辑:生成的 JSON 正在与 D3.js 图表库一起使用,因此出现了奇怪的问题(以及明显的反对票)

我从 API 返回的数据如下所示:

var data = [
    [
        {"id": 1, "key1":"value1", "key2":"value2", "key3":"value3"},
        {"id": 2, "key1":"value1", "key2":"value2", "key3":"value3"},
        {"id": 3, "key1":"value1", "key2":"value2", "key3":"value3"},
        {"id": 4, "key1":"value1", "key2":"value2", "key3":"value3"},
        {"id": 5, "key1":"value1", "key2":"value2", "key3":"value3"},
        {"id": 6, "key1":"value1", "key2":"value2", "key3":"value3"}
    ]
];

我需要我的 JSON 将每个对象嵌套在之前的对象中,如下所示:

{
    "name" : "1",
    "children" : [
    {
        "name" : "2",
        "children" : [
            {
                "name" : "3",
                "children" : [
                    {
                        "name" : "4",
                        "children" : [
                            {
                                "name" : "5",
                                "children" : [
                                    {
                                        "name" : "6",
                                        "children" : [ ]
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }]
}

出于演示目的,我只在 6 处停下来 - 我需要可以处理 N 个对象的东西。 目前我正在使用_.each 循环遍历data 对象,但不知道如何进行嵌套。

任何帮助都会很棒 - 谢谢!

【问题讨论】:

  • 我需要这样做,因为我正在构建一个使用这种 JSON 类型的 D3 树可视化
  • 如果你的树是递归的,你的方法也应该如此。
  • 我看到的问题是,对于您的要求并没有一个过于笼统的解决方案。数据可能有一些 ID 链接父母和孩子,而不仅仅是 array[n+1]array[n] 的孩子。这使得递归地构建对象成为一个不同于任意嵌套 N 层深度的函数。如果结构真的是这样,我会在这里放一些东西。
  • @cdbajorin 是的,这就是源数据的外观,以及 JSON 的结构。
  • 是否有任何答案解决了您的问题?任何反馈将不胜感激。

标签: javascript json d3.js underscore.js


【解决方案1】:

var data = [ [{ "id": 1, "key1": "value1", "key2": "value2", "key3": "value3" }, { "id": 2, "key1": "value1", "key2": "value2", "key3": "value3" }, { "id": 3, "key1": "value1", "key2": "value2", "key3": "value3" }, { "id": 4, "key1": "value1", "key2": "value2", "key3": "value3" }, { "id": 5, "key1": "value1", "key2": "value2", "key3": "value3" }, { "id": 6, "key1": "value1", "key2": "value2", "key3": "value3" }] ];

var r = (function rec(d, o, i) {
    if (i == -1) return o;
    var t = {};
    t.name = d[i].id;
    t.children = [];
    t.children.push(o);
    return rec(d, t, --i);
})(data[0], {}, data[0].length - 1);


document.write('<pre>' + JSON.stringify(r, 0, 2) + '</pre>');

【讨论】:

    【解决方案2】:

    这就是我想出的。 @isvforall 快一点,但我更喜欢我的。 ;)

    var data = [ [{ "id": 1, "key1": "value1", "key2": "value2", "key3": "value3" }, { "id": 2, "key1": "value1", "key2": "value2", "key3": "value3" }, { "id": 3, "key1": "value1", "key2": "value2", "key3": "value3" }, { "id": 4, "key1": "value1", "key2": "value2", "key3": "value3" }, { "id": 5, "key1": "value1", "key2": "value2", "key3": "value3" }, { "id": 6, "key1": "value1", "key2": "value2", "key3": "value3" }] ];
    
    var result = (function buildTree(input, index) {
      if (index >= input.length)
        return [];
    
      return [
        {
          name: input[index].id,
          children: buildTree(input, index + 1)
        }
      ];
    })(data[0], 0);
    
    document.write('<pre>' + JSON.stringify(result, 0, 2) + '</pre>');

    编辑:添加了来自@isvforall 的代码用于演示。我们的解决方案都使用递归,只是构建树的方式不同。

    【讨论】:

      猜你喜欢
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2023-03-21
      • 2013-03-15
      相关资源
      最近更新 更多