2010-12-03 1 views
0

ノードを設定して再帰的に階層構造のツリーをレンダリングしようとしています(インデックス)。私はすでに根を知っている(トップ)。複数のルート要素があります。私は、変数ツリーで全体のhtmlを収集しようとしていますJavascript再帰関数は、最初のパスの後に終了するようです。

tree = ""; 
top = ["1", "11", "14", "17", "72", "73", "74", "78", "79", "98", "99"]; 
index = { 
    1: { 
     'name': "Node 1", 
     'children': "2,3,4,5,6,7,8,9,10" 
    }, 
    2: { 
     'name': "Node 2", 
     'children': "" 
    }, 

//.... goes all the way upto 99 
} 

再帰関数makeFT(インデックス、根)子供だけを横断した後に破るようだ(この全体のHTMLは、後にdiv要素に追加されます) 「トップ」配列の最初の要素の

コードはjsbin以下です。何が問題なの?これを行うより良い方法はありますか?どんな助けもありがとうございます。

makeFT(index, top); 


function makeFT(index, roots) { 
    console.log(roots); 
    tree == "" ? tree += '<ul>' : tree += '<ul><hr/>' 
    for (i = 0; i < roots.length; ++i) { 
     n = parseInt(roots[i]); 
     //console.log(n); 
     //console.log(index[n]); 

     tree += '<li>' + roots[i] + '</span>' + index[n].name; 

     if (index[n].children === "") { 
      tree += '<input class="leaf tree-first-input" type="text" size="2">' 
     } 
     else { 
      tree += '<input class="non-leaf tree-first-input" type="text" size="2">' 
      makeFT(index, index[n].children.split(",")); 
     } 
     tree += "</li>" 
    } 
    tree += '</ul><br/>' 

} 

UPDATE:これはスコープの問題であり、再帰の問題ではないことがわかります。再帰は大丈夫だった。ルート配列をループしている間に変数 'i'のスコープを定義しなかったので、それ以降の再帰関数はスコープなし 'i'の値を継承し、問題が発生しました。

答えて

4

関数内にvar i = 0を追加します。あなたはiとのスコープの問題があります。

http://jsbin.com/ugoju4/12/edit

+0

+1優れた検索語です。 – Tomas

+0

また、将来のバグを避けるために 'var n'と' var tree'を追加することをお勧めします。 – Tomas

+0

@Tomas、ありがとう。はい、私は関連スコープを追加します。 'var i'部分が見つかりませんでした。その結果、後続の各関数はiの値を継承しました。 rcravensによるBrilliantの発見。 – papdel

0

あなたは再帰関数から何も返されません。

} 
     else { 
      tree += '<input class="non-leaf tree-first-input" type="text" size="2">' 
      tree += makeFT(index, index[n].children.split(",")); 
     } 
     tree += "</li>" 
    } 
    tree += '</ul><br/>' 
    return tree; 
} 

これはあなたに価値があるはずです。それを使ってIdに要素を書き出します。 012sを更新しました

+0

私はtreeがグローバルに定義された変数だと思うので、この関数は値を返さないでください。 – EvilMM

+0

この問題は、値を返すかどうかに関係なく発生しています。それを試してみてください。 – papdel

+0

@EvilMM - 正確に – papdel

-1
  1. for-statementに "++ i"と入力したのはなぜですか?私は彼が実行されることはありませんだと思う

index[n].children == "" 

でそれを試してみてください "[n]は.children ===" あなたは

インデックスを入力している

  • を "私は++" を使用しelse-part。

  • +0

    for文の 'i ++'または '++ i'はまったく異なっていません。 – Tomas

    +0

    さらに、子は文字列であるため、 '==='は正しい演算子(-1) – Tomas

    0

    top現在のフレームセットの「トップ」ウィンドウを参照し、グローバル変数です。別の変数名を使用してください。

    関連する問題