2013-02-20 80 views
2

我試圖將通過ajax獲得的對象列表轉換爲類別菜單的嵌套ul。在瀏覽本網站後,我找到了一個PHP函數並將其轉換爲javascript。將對象列表轉換爲嵌套UL不起作用

遺憾的是它不工作:

function has_children(data, id) { 
    for(a=0; a<data.length; a++) { 
     if (data[a].ParentID == id) return true; 
    } 
    return false; 
} 

function renderCategoryTree(data, parent) { 
    result = "<ul>"; 
    for(index=0; index<data.length; index++) { 
     if (data[index].ParentID == parent) { 
      result = result + "<li>" + data[index].Name; 
      if (has_children(data, data[index].ID)) 
       result = result + renderCategoryTree(data, data[index].ID); 
      result = result + "</li>"; 
     } 
    } 
    result = result + "</ul>"; 

    return result; 
} 

var stuff= [ { ID: 1, ParentID: 0, Name: 'Development' }, 
{ ID: 2, ParentID: 0, Name: 'Databases' }, 
{ ID: 3, ParentID: 0, Name: 'Systems' }, 
{ ID: 4, ParentID: 1, Name: 'java' }, 
{ ID: 5, ParentID: 1, Name: 'c++' }, 
{ ID: 6, ParentID: 1, Name: 'python' }, 
{ ID: 7, ParentID: 1, Name: 'ruby' }, 
{ ID: 8, ParentID: 2, Name: 'mysql' }, 
{ ID: 9, ParentID: 2, Name: 'oracle' }, 
{ ID: 10, ParentID: 2, Name: 'sqlite' }, 
{ ID: 11, ParentID: 3, Name: 'linux' }, 
{ ID: 12, ParentID: 3, Name: 'windows' } ]; 

    alert(renderCategoryTree(stuff, 0)); 

渲染停在 「紅寶石」。我認爲問題是與JavaScript打字工作的方式,但我不知道。誰能幫忙?謝謝!

回答

4

我不是100%確定,但我認爲你的循環計數器是全局的。所以,如果你寫

for(var a=0; a<data.length; a++) { 

,而不是

for(a=0; a<data.length; a++) { 

for(var index=0; index<data.length; index++) { 

,而不是

for(index=0; index<data.length; index++) { 

它會奏效。

+1

你說得對。我和你同時回答了這個問題。你會得到正確的答案,因爲你花了時間和精力。謝謝! – SrgHartman 2013-02-20 12:11:29

+0

和演示http://jsfiddle.net/bLE8y/ 良好的演示爲什麼必須永遠記住'var'關鍵字。 – dfsq 2013-02-20 12:12:49

1

我發現了這個問題:因爲JavaScript變量存在嵌套的函數調用,您必須使用var使它們成爲本地。

只需將var添加到索引聲明工作!