0

我在 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;
}

看起来我的递归工作不正常。你能帮我解决这个问题吗?

4

1 回答 1

1

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

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

于 2013-01-28T19:31:13.337 回答