将json对象转换为树json对象

时间:2016-01-17 18:24:59

标签: javascript jquery json

查看我的代码here,但请先阅读此内容。实际上我试图将标签缩进文本转换为树。我在这里看到了一些相关的问题,但我并不喜欢任何正确的答案。在解决了这个问题之后,我将发布"将标签缩进文本转换为树"的整个解决方案。但是现在我陷入了这段代码。

这只是我想要的一个例子。我拥有的第一个json对象,我想根据级别值将该简单的json转换为树形结构的json。

例如:第一个json对象级别是0比我想要转换为root,下一个json对象级别是1比我想要将这个json对象转换为第一个json对象的子对象,下一个如果json对象级别是2比我想要将第三个json对象转换为第二个json对象的子级。看下面的代码可能是你可以理解的。

我想要这样的最终输出:

parent1
  child1
    child2
parent2
  child1
    child2
      child3
    child4
  child5

我有这样的json对象:

    [
  {
    "lable": "parent1",
    "level": 0
  },
  {
    "lable": "child1",
    "level": 1
  },
  {
    "lable": "child2",
    "level": 2
  },
  {
    "lable": "parent2",
    "level": 0
  },
  {
    "lable": "child1",
    "level": 1
  },
  {
    "lable": "child2",
    "level": 2
  },
  {
    "lable": "child3",
    "level": 3
  },
  {
    "lable": "child4",
    "level": 2
  },
  {
    "lable": "child5",
    "level": 1
  }
]

我想像这样转换它(如果我的下面的json无效,请更正):

    [
  {
    "text": "parent1",
    "children": [
      {
        "text": "child1",
        "children": [
          {
            "text": "child2",
            "children": [

            ]
          }
        ]
      }
    ]
  },
  {
    "text": "parent2",
    "children": [
      {
        "text": "child1",
        "children": [
          {
            "text": "child2",
            "children": [
              {
                "text": "child3",
                "children": [

                ]
              }
            ]
          },
          {
            "text": "child4",
            "children": [

            ]
          }
        ]
      },
      {
        "text": "child5",
        "children": [

        ]
      }
    ]
  }
]

2 个答案:

答案 0 :(得分:2)

此解决方案仅适用于已排序的数据。它使用Array.prototype.reduce()来收集所有数据,使用\.\d来获取推送数据的正确级别。



for loop




另一个没有var data = [{ "lable": "parent1", "level": 0 }, { "lable": "child1", "level": 1 }, { "lable": "child2", "level": 2 }, { "lable": "parent2", "level": 0 }, { "lable": "child1", "level": 1 }, { "lable": "child2", "level": 2 }, { "lable": "child3", "level": 3 }, { "lable": "child4", "level": 1 }, { "lable": "child5", "level": 2 }], tree = data.reduce(function (r, a) { var i, p = r; for (i = 1; i <= a.level; i++) { p = p[p.length - 1].children; } p.push({ text: a.lable, children: [] }); return r; }, []); document.write('<pre>' + JSON.stringify(tree, 0, 4) + '</pre>');的解决方案和一个用于引用该级别的临时变量。

&#13;
&#13;
for loop
&#13;
&#13;
&#13;

答案 1 :(得分:1)

Nina的答案很好,但在这种情况下使用reduce是不必要的,因为存在嵌套的for循环。我建议使用没有嵌套循环的简单实现:

function convertToTree(items) {
    var tree = [], stack = [];
    items.forEach(function(item){
        var leaf = { text: item.lable, children: [] };
        if (stack.length <= item.level) stack.push(leaf);
        item.level ? stack[item.level - 1].children.push(leaf) : tree.push(leaf);
        stack[item.level] = leaf;
    });
    return tree;
}

修改过的小提琴是here