我正在尝试使用JavaScript动态形成类似下面的嵌套树对象,有人可以告诉我实现此目的的最佳方法吗?
var contextpath= {
text: "TreeRoot",
items: [ {
text: "subgroup1" ,
items: [ {
text: "subgroup2",
items: [ {
text: "subgroup3",
items: [ {
text: "subgroup4",
items: [ {
text: "subgroup5"
}]
}]
}]
}]
}]
};
我有一个分隔的字符串,我试图转换为对象(可以用作树组件的dat源)。
var path =“TreeRoot | subgroup1 | subgroup2”;
尝试实现类似下面的内容,但使用较少数量的变量进行递归/循环。
var contextpathText= {};
contextpathText.text ="TreeRoot";
var childObject={};
var items=[];
childObject.text ="subgroup1";
items.push(childObject);
contextpathText.items=(items);
答案 0 :(得分:2)
您需要一个深度计数器并存储您正在使用的对象的当前级别。
var obj = {text:''}, parent, child, i = 0;
obj.text = 'TreeRoot';
parent = obj;
while (++i <= 5) {
if (parent.items === undefined) parent.items = []; // because you don't have an items on the last subgroup you can't put it in the object literal
child = {text: 'subgroup'+i};
parent.items.push(child);
parent = child;
}
parent = child = null; // cleanup
obj;
jsbeautified JSON.stringify(obj)
现在
{
"text": "TreeRoot",
"items": [{
"text": "subgroup1",
"items": [{
"text": "subgroup2",
"items": [{
"text": "subgroup3",
"items": [{
"text": "subgroup4",
"items": [{
"text": "subgroup5"
}]
}]
}]
}]
}]
}
编辑分隔字符串
var path = 'TreeRoot|subgroup1|subgroup2';
var obj = {text:''}, parent, child, levelText = path.split('|').reverse();
obj.text = levelText.pop() || '';
parent = obj;
while (levelText.length > 0) {
child = {text: levelText.pop()};
if (!parent.items) parent.items = [];
parent.items.push(child);
parent = child;
}
obj;
答案 1 :(得分:1)
打败我,但我接受了这段代码:
var contextpath = { text: "TreeRoot", items: []}
var items = contextpath.items;
for(var i = 1; i <= 5; i++) {
items.push({ text: "subgroup" + i, items: []});
items = items[0].items;
}
父母&amp;对于这类事情,子命名法肯定更清楚,但我想表明你不必先将新对象声明为变量,你可以只推动对象文字。
哎呀,刚刚注意到你所需的结构中没有一个items数组。我的代码创建了备用,所以你最终得到了
// snip
text: "subgroup4",
items: [ {
text: "subgroup5",
items: []
}]
// etc.