1
   var treeData = {"name" : "A",  "children" : [
                         {"name" : "B", "children": [
                                 {"name" : "C", "children" :[]}
                          ]}
                   ]};

之前的数组应该是空的。应根据通过的动态值定义所需的节点数来填充 AFTER 数组。

我想动态构建层次结构,每个节点都创建为层次结构中的层/级别,具有自己的节点数组。这应该形成一个树形结构。这是上面代码中描述的层次结构。应该有一个根节点,以及一个未定义数量的节点和级别来构成层次结构大小。除了根节点之外,什么都不应该被修复。我不需要阅读或搜索层次结构,我需要构建它。数组应该从 {"name" : "A", "children" : []} 开始,并且每个新节点都将被创建为级别 {"name" : "A", "children" : [HERE-{"name" : “A”,“儿童”:[]}]}。在子数组中,越来越深。基本上,数组在调用之前应该没有值,除了根节点。在函数调用之后,数组应该包含一个数字的所需节点,根据数据库查询的结果,每次调用可能会有所不同。每个子数组将包含一个或多个节点值。至少应该有 2 个节点级别,包括根。它最初应该是一个空白画布,即没有预定义的数组值。

4

1 回答 1

1

这是动态创建节点的函数示例:

function createNode(name) {
   return({name: name, children: []});
}

function addChild(node, child) {
    node.children.push(child);
    return node;
}

var treeData = createNode("");
var subChild = createNode("");
addChild(subChild, createNode("A31"));
addChild(treeData, subChild);

但我建议改用原型。

通过任何级别的“路径”查找任何节点:

function findNodeByPath(root, path) {
   var curr; 
   while(root && ((curr = path.splice(0,1)[0]) !== undefined)) {
        if (root.children) root = root.children[curr];
        else root = undefined;
   }
   return root;
}


function findNodeByName(root, namePath, create) {
   var curr; 
   while(root && ((curr = namePath.splice(0,1)[0]) !== undefined)) {
        if (root.children) {
            var found = undefined;
            for (var i = 0; !found && i < root.children.length; i++)
                if (root.children[i].name == curr) found = root.children[i];
            if (create && !found) {
                found = createNode(curr);
                addChild(root, found);
            }
            root = found;
        }
        else root = undefined;
   }
   return root;
}


var A31 = findNodeByPath(treeData, [0, 0]); // Will return the node with name A31
addChild(A31, createNode("A31 child 1"));
addChild(A31, createNode("A31 child 2"));

// second child will be accessible by:
var secondChildOfA31 = findNodeByPath(treeData, [0, 0, 1]);

// also to find node by the name:
var secondChildOfA31 = findNodeByName(treeData, ["", "A31", "A31 child 2"]);

// will create all intermenient nodes with respective names:
var veryDeepChild =  findNodeByName(treeData, ["foo", "bar", "baz", "quux", "moo"], true);

function createOuterNode(name, childNode) {
    return {name: name, children: childNode? [childNode] : []}
}

// Example to create nodes in the question:
var CNode = createOuterNode("C");
var BNode = createOuterNode("B", CNode);
var ANode = createOuterNode("A", BNode);

// Example using LOOP:
var list = ["A", "B", "C"];
var outer = undefined;
for (var i = list.length - 1; i >= 0; i--) outer = createOuterNode(list[i], outer);

// outer will contain A node with child B with child C
console.log(outer);
于 2012-09-20T15:33:09.467 回答