Javascript 无settimeout的递归js函数

Javascript 无settimeout的递归js函数,javascript,recursion,Javascript,Recursion,我正在尝试将一个正在工作的PHP函数重写为javascript,因为我需要在浏览器端完成这项工作,并将事件处理程序添加到我希望添加到页面的对象中 该函数获取一个具有父子关系的节点数组,查看一个节点,然后查看其子节点,然后查看其子节点的子节点等,直到找到树的结尾 工作PHP函数: //print nodes function display_child_nodes($parent_id, $level) { global $task_list, $index; if(isset($inde

我正在尝试将一个正在工作的PHP函数重写为javascript,因为我需要在浏览器端完成这项工作,并将事件处理程序添加到我希望添加到页面的对象中

该函数获取一个具有父子关系的节点数组,查看一个节点,然后查看其子节点,然后查看其子节点的子节点等,直到找到树的结尾

工作PHP函数:

//print nodes
function display_child_nodes($parent_id, $level) {
global $task_list, $index;
    if(isset($index[$parent_id]))
        {
            foreach ($index[$parent_id] as $id) {
                echo str_repeat("-", $level) . $task_list[$id]["title"] . "<br />";
                display_child_nodes($id, $level + 1);
            }
        }
}
display_child_nodes(0, 0);
PHP函数的结果如下所示: A

B

-C

-D

-E

F

G

这是我试图编写的Javascript,但我怀疑在该函数中对函数show\u child\u nodes表单的调用不正确

该函数正确地生成第一个节点,但在尝试分析子节点时会立即停止,因此我怀疑函数内部的调用是问题所在

javascript从php脚本接收一个json数组,它包含一个节点任务列表及其详细信息,以及顺序索引数组,其结构为[parent_id1=>array[1,2,3],parent_id2=>[4,5],parent_id3=>[6,7,8]]等。。。与中一样,每个父id都是一个键,其子id作为值

以下是JSON:

{"tasks":{"2":{"id":"2","title":"Task 2","desc":"Task 2 description","parent_id":"0"},"6":{"id":"6","title":"Task 6","desc":"Task 6 description","parent_id":"0"},"1":{"id":"1","title":"Task 1","desc":"Task 1 description","parent_id":"2"},"3":{"id":"3","title":"Task 3","desc":"Task 3 description","parent_id":"1"},"4":{"id":"4","title":"Task 4","desc":"Task 4 description","parent_id":"1"},"5":{"id":"5","title":"Task 5","desc":"Task 5 description","parent_id":"3"}},"order_index":{"0":["2","6"],"2":["1"],"1":["3","4"],"3":["5"]}}


            $.getJSON("get_items_hierarchy.php",function(data,status){

                var order_index = data.order_index;
                var tasks = data.tasks;
                var output = [];

                function show_child_nodes(parent_id,level){
                    if(order_index[order_index[parent_id]])
                        {
                            $.each(order_index[parent_id],function(index,id){
                                var margin = level * 40;
                                output.push('<div style="float: left; clear: left; margin-left: ' + margin + 'px">' + tasks[id]['title'] + '</div> ');
                                show_child_nodes(id, level + 1);
                            });
                        }
                }
                show_child_nodes(0,0);

            $.each(output,function(index,line){
                $("#tasks").append(line);
            });

    });
这似乎可以解决问题

演示:

更改此行:

if(order_index[order_index[parent_id]])
致:


我没有发现算法本身有任何错误,但以下部分可能是一个问题:

$.each(output, function(index,line){
    $("#tasks").append(line);
});
此代码引用输出的值,但:

$.getJSON是异步的,因此该值还没有准备好

该变量只能从AJAX回调内部访问

代码应该放在AJAX回调函数的末尾

正如另一个答案所提到的,这种说法可能是错误的:

if (order_index[order_index[parent_id]])
这可能只是一个输入错误,但可能正确的代码是:

if (order_index[parent_id])

你能添加设置订单索引和任务的代码吗?编辑制作,谢谢你回复我,包含了所有的javascript和对其处理的解释。。。希望这能使代码更清晰。最好有示例数据来运行代码,例如php.cool的逐字输出,通过php脚本get_items_层次结构添加了来自my DB的json。php@RogerCurran我想我的答案解决了这个问题。在那次改变后,他为我工作。哇!完全修好了。非常感谢。
if (order_index[parent_id])