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 =newArray;を移動してみてください。get_all_childs()関数のスコープ外。その変数がその関数の呼び出しごとに新しい配列として再宣言されると、その関数の最後の呼び出しの結果のみが得られます。

一方、その変数がその関数のスコープ外に存在する場合、コードが繰り返されると、その配列にプッシュされた値は、関数への複数の呼び出しを通じて保持されます。

于 2013-01-28T19:31:13.337 に答える