2

ajax を介して取得したオブジェクトのリストを、カテゴリ メニューのネストされた ul に変換しようとしています。このサイトを見た後、PHP関数を見つけてjavascriptに変換しました。

残念ながら、それは機能していません:

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

2 に答える 2

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++) {

それが動作します。

于 2013-02-20T12:10:17.997 に答える
1

私は問題を発見しました:javascript変数はネストされた関数呼び出しに耐えるため、varを使用してローカルにする必要があります。

インデックス宣言のためにvarを追加するだけでうまくいきました!

于 2013-02-20T12:10:33.223 に答える