1

我正在尝试使用 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);
4

2 回答 2

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;
于 2012-12-11T23:14:02.720 回答
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;
}

对于这类事情,父子命名法肯定更清晰,但我想表明您不必先将新对象声明为变量,您只需推送对象字面量即可。

哎呀,刚才注意到您想要的结构中没有 items 数组。我的代码创建了备用,所以你最终得到

// snip
                text: "subgroup4",
                    items: [ {
                        text: "subgroup5",
                        items: []
                    }]
// etc.
于 2012-12-11T23:18:29.110 回答