我在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;
}
看起来我的递归无法正常工作。 你能帮帮我吗?
答案 0 :(得分:1)
尝试移动var all_children = new Array;在get_all_childs()函数的范围之外。在每次调用该函数时,将该变量重新声明为新数组,您将只得到该函数最终调用的结果。
然而,如果该变量存在于该函数的范围之外,则当代码递归时,推送到该数组的值将通过多次调用该函数而持续存在。