0

箇条書きリストに入れたい JSON があります。各レベルには、name フィールドと children フィールドがあります (最下位レベルを除く)。再帰を使用してそれを実行しようとしましたが、問題が発生しました。最後のレベルを除いて、最初の子のみが表示されます。再帰呼び出しの一部が適切に返されない可能性があると感じています。これが私がこれまでに持っているコードです:

function load_menu(){
    json_text=ajax_get("example.json");
    json_tree=JSON.parse(json_text);
    write_menu(json_tree.children,document.getElementById("level1"));
}
function write_menu(json,element){
    for(i=0;i<json.length;i++){
        var listitem=document.createElement("li");
        element.appendChild(listitem);
        var listitemtext=document.createElement("span");
        listitem.appendChild(listitemtext);
        listitemtext.innerText=json[i].name;
        if(json[i].children){
            listitemtext.setAttribute("onclick","toggle(this);");
            var sublist=document.createElement("ul");
            listitem.appendChild(sublist);
            write_menu(json[i].children,sublist);
        };
    };
}

最終的には次のようなツリーになります。

Level 1,1
    Level 2,1
        Level 3,1
        Level 3,2

次のようになります。

Level 1,1
    Level 2,1
        Level 3,1
        Level 3,2
    Level 2,2
Level 1,2
    Level 2,3

私は自分の JSON を確認しましたが、問題ないようですので、どこかで再帰に問題があるに違いないと思います。誰か助けてくれませんか?

4

1 に答える 1

2

for (i...JS インタープリターを作成すると、変数が存在しない場合は新しい変数が作成され、存在iする場合は既存の変数が再利用されます。ここで問題になるのは、再帰のすべてのレベルで新しいループ変数が必要になるためです。

したがって、解決策は、for (var i...代わりに書くことによって、すべてのレベルで変数の作成を強制することです。

于 2012-04-25T19:48:09.080 に答える