2010-12-03 124 views
0

我試圖通過設置一個節點(索引)遞歸時渲染樹狀分層結構。我已經知道根源(top)。有多個根元素。我想收集變量整個HTML(這整個HTML將被追加到後面一個div)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(指數,根)似乎只穿越後孩子打破「頂部」數組中的第一個元素。代碼爲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/>' 

} 

更新:原來這是一個範圍問題,而不是一個遞歸問題。遞歸是正常的。由於在循環遍歷根數組時,我沒有定義變量'i'的範圍,因此每個後續遞歸函數都會繼承unscoped'i'的值,從而產生問題。

回答

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將它寫入一個元素。更新了jsfiddle

+0

我認爲tree是一個全局定義的變量,所以這個函數不能返回任何值。 – EvilMM 2010-12-03 12:21:28

+0

不管我是否返回值,都會發生此問題。試試自己。 – papdel 2010-12-03 12:23:35

+0

@EvilMM - 正確 – papdel 2010-12-03 12:24:03

-1
  1. 爲什麼在你的for語句中鍵入「++ i」?用 「我++」
  2. 你打字

    指數[N]。孩子=== 「」

index[n].children == "" 

嘗試它,我覺得他從來沒有在運行else部分。

0

top是一個全局變量指的是當前幀組的「頂」的窗口。使用不同的變量名稱。