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

前の配列は空である必要があります。後の配列は、渡された動的な値から定義される必要なノードの数に応じて生成される必要があります。

階層内に独自のノード配列を持つレイヤー/レベルとして作成された各ノードを使用して、階層を動的に構築したいと思います。これは、ツリー構造を形成する必要があります。これは、上記のコードで説明されている階層構造です。ルートノードと、階層サイズを構成するノードとレベルの数が未定義である必要があります。ルートノード以外は修正しないでください。階層を読んだり検索したりする必要はありません。階層を構築する必要があります。配列は{"name": "A"、 "children":[]}で始まり、レベルとしてすべての新しいノードが作成されます{"name": "A"、 "children":[ここ-{"name": "A"、 "children":[]}]}。子配列では、どんどん深くなっていきます。基本的に、ルートノードを除いて、配列には呼び出し前の値がないはずです。関数呼び出しの後、配列は、データベースクエリの結果に応じて、呼び出しごとに異なる可能性のある番号の必要なノードで構成されている必要があります。すべての子配列には、1つ以上のノード値が含まれます。ルートを含めて、少なくとも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 に答える