递归地找到树中的所有孩子

时间:2013-01-28 19:26:51

标签: tree d3.js

我在D3中使用树木,到目前为止它已经很有趣了。 鉴于用户点击内部节点(圆圈),我想

  • 提供所有叶子名称的列表
  • 为从该节点通向树叶的所有路径着色。

以下是我为此目的编写的一些代码

   var circles = nodeEnter.append("svg:circle")
      .attr("r", function(d){ return d.children ? 5 : 0; })
      .on("click", get_all_children);


    function get_all_children(d){
         var all_children = get_all_childs(d);
             console.log("end, our array has: "+all_children.length+" elements");
            all_children.forEach(function(elem){
                console.log(elem.name);
        });
}

function get_all_childs(d, all_childs){
    var all_children = new Array;
    all_children.push(all_childs);

    if(d.children){
            var children = d.children;
            for (var i = 0; i < children.length; i++) {
                var temp_array = get_all_childs(children[i], all_children);
                console.log("got from recursion: : "+temp_array.length+" children");
                all_children.push(temp_array);
            }
    }
    else{
        //return all_children;
        //console.log("end, our array has: "+all_children.length+" elements");
    }
    return all_children;
}

看起来我的递归无法正常工作。 你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

尝试移动var all_children = new Array;在get_all_childs()函数的范围之外。在每次调用该函数时,将该变量重新声明为新数组,您将只得到该函数最终调用的结果。

然而,如果该变量存在于该函数的范围之外,则当代码递归时,推送到该数组的值将通过多次调用该函数而持续存在。