如何在Javascript中形成嵌套对象

时间:2012-12-11 22:57:35

标签: javascript treeview

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

2 个答案:

答案 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.