动态分层Javascript对象循环


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

前面的数组应该为空。之后的数组应该根据所需的节点数量进行填充,这些节点将根据传递的动态值进行定义。

我想动态构建层次结构,将每个节点创建为层次结构中的一个层/级别,并拥有自己的节点阵列。这应该形成一个树状结构。这就是上面代码中描述的层次结构。应该有一个根节点,以及未定义数量的节点和级别来组成层次结构的大小。除了根节点之外,不应修复任何内容。我不需要阅读或搜索层次结构,我需要构建它。数组应该以{"name":"A","children":[]}开头,并且每个作为级别的新节点都将被创建{"name:"A","children":[HERE-{"name':"A"、"children。在子数组中,越来越深。基本上,除了根节点之外,数组在调用之前不应该有任何值。在函数调用之后,数组应该包括一个数字的所需节点,该数字可能随着每次调用而变化,具体取决于数据库查询的结果。每个子数组都将包含一个或多个节点值。至少应该有2个节点级别,包括根节点。它最初应该是一个空白画布,没有预定义的数组值。

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

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);

最新更新