我有以下方法来初始化树:
function _initTree(treeObj, options){
treeObj = treeObj || [];
if(!zpJSUtils.isArray(treeObj)) throw new Error("Input tree must be an array");
this.tree = treeObj;
this.rootNode = treeObj[0];
_buildNodes.call(this, treeObj);
}
init
方法遍历树以将所有对象初始化为节点:
function _buildNodes(treeObj){
traverseTree.call(treeObj, function(nodeObj){
node = new Node(nodeObj);
return true;
}, this);
}
traverseTree方法(从交换机中选择):
function _walkPreOrder(tree, callback, ctx){
tree.forEach(function(node, idx){
var continueWalk = callback.call(ctx, node);
if(continueWalk){
if(node.hasChildren()){
_walkPreOrder.call(this, node);
};
};
}, this);
}
问题是这个。
我想在init上计算树的高度,这是根节点和叶子之间最长的向下路径上的边数。
所以似乎为了计算高度,我将不得不再次走树(找到最深的嵌套元素的水平)。
json的格式是:
var json = [{ text: "root", children: [
{id: "id_1", text: "node_1", children:[
{id: "id_c1", text: "node_c1"},
{id: "id_c2", text: "node_c2", children: [
{id: "id_c2_c1", text: "node_c2_c1"},
{id: "id_c2_c2", text: "node_c2_c2"},
{id: "id_c2_c3", text: "node_c2_c3"}]},
{id: "id_c3", text: "node_c3"}]},
{id: "id_2", text: "node_2"}]}];
问题是_walkPreOrder
可以接受多个回调(例如数组),但这会导致一个可疑的api(因为传入多个函数可以继续行走当条件为真/假可疑时树。
解决这个问题的好方法是什么,即避免多次迭代?
答案 0 :(得分:2)