javascript - 没有settimeout的递归js函数

标签 javascript recursion

我正在尝试将一个正在运行的 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 函数的结果如下所示:

B

-C

-D

--E

F

G

这是我尝试编写的Javascript,但我怀疑该函数内对函数show_child_nodes 形式的调用不是正确的JS...

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

javascript 正在从 php 脚本接收一个 json 数组,它包含节点(任务)及其详细信息的列表,以及结构为 [parent_id1 => array[1,2,3],parent_id2 = > [4,5],parent_id3 => [6,7,8]] 等等...例如,每个parent_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);
            });

    });

最佳答案

这似乎解决了这个问题。

演示: jsFiddle

更改此行:

if(order_index[order_index[parent_id]])

至:

if( order_index[parent_id] )

关于javascript - 没有settimeout的递归js函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14847657/

相关文章:

javascript - React Native - 在子事件处理程序更新父状态后,子中的 .Map() 项目不会重新渲染

javascript - 从包访问 meteor 应用程序的导入目录?

recursion - 调试简单的 LISP 函数。

python - 这个递归函数能否变成具有类似性能的迭代函数?

javascript - Angular 指令需要访问 ng-repeat 中的变量

javascript - 可以运行 Javascript 但不能运行 jQuery?

javascript - 无法使用 JavaScript 添加表格行

递归时Haskell Print?

c - 具有递归功能的 10 基的基数转换器 - C

javascript - 理解Javascript中的递归函数与逻辑运算符相结合