查看我的代码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": [
]
}
]
}
]
答案 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>');
的解决方案和一个用于引用该级别的临时变量。
for loop
&#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。