javascript - 递归函数创建树

标签 javascript recursion tree

我必须将 JSON 文件转换为特殊 div 中的树。
将 JSON 转换为 Javascript 对象不是问题,但我在使用递归函数将树显示到我的 div 中时遇到了一些问题。
什么有效:我的递归函数允许我在控制台中显示所有子项。
不可以:我可以只将第一个子元素显示到 div 中,而不是第一个子元素的子元素。我认为问题来自“appendChild”方法。

如果您能帮助我,我将不胜感激。

JSON 代码:

{
  "dir":"",
  "name":"myProject",
  "type":"folder",
  "children":[
    {
      "dir":"myProject",
      "name":"css",
      "type":"folder",
      "children":[
        {
          "dir":"myProject/css",
          "name":"main.css",
          "type":"file"
        },
        {
          "dir":"myProject/css",
          "name":"menu.css",
          "type":"file"
        },
        {
          "dir":"myProject/css",
          "name":"user.css",
          "type":"file"
        }
      ]
    },
    {
      "dir":"myProject",
      "name":"fonts",
      "type":"folder"
    },
    {
      "dir":"myProject",
      "name":"images",
      "type":"folder",
      "children":[
        {
          "dir":"myProject/images",
          "name":"logo.png",
          "type":"file",
          "corrupted":true
        }
      ]
    },
    {
      "dir":"myProject",
      "name":"index.html",
      "type":"file"
    },
    {
      "dir":"myProject",
      "name":"js",
      "type":"folder",
      "children":[
        {
          "dir":"myProject/js",
          "name":"controllers",
          "type":"folder",
          "children":[
            {
              "dir":"myProject/js/controllers",
              "name":"core",
              "type":"folder",
              "children":[
                {
                  "dir":"myProject/tempjs/controllerslates/core",
                  "name":"menu.js",
                  "type":"file"
                }
              ]
            },
            {
              "dir":"myProject/js/controllers",
              "name":"errors",
              "type":"folder",
              "children":[
                {
                  "dir":"myProject/js/controllers/errors",
                  "name":"error.js",
                  "type":"file"
                }
              ]
            },
            {
              "dir":"myProject/js/controllers",
              "name":"home",
              "type":"folder",
              "children":[
                {
                  "dir":"myProject/js/controllers/home",
                  "name":"homePage.js",
                  "type":"file"
                }
              ]
            },
            {
              "dir":"myProject/js/controllers",
              "name":"home",
              "type":"folder",
              "children":[
                {
                  "dir":"myProject/js/controllers/user",
                  "name":"list.js",
                  "type":"file"
                },
                {
                  "dir":"myProject/js/controllers/user",
                  "name":"login.js",
                  "type":"file"
                },
                {
                  "dir":"myProject/js/controllers/user",
                  "name":"profile.js",
                  "type":"file"
                },
                {
                  "dir":"myProject/js/controllers/user",
                  "name":"subscribe.js",
                  "type":"file"
                }
              ]
            }
          ]
        },
        {
          "dir":"myProject/js",
          "name":"libs",
          "type":"folder",
          "children":[
            {
              "dir":"myProject/js/libs",
              "name":"handlebars.min.js",
              "type":"file"
            },
            {
              "dir":"myProject/js/libs",
              "name":"jquery.min.js",
              "type":"file"
            },
            {
              "dir":"myProject/js/libs",
              "name":"require.min.js",
              "type":"file",
              "corrupted":true
            }
          ]
        },
        {
          "dir":"myProject/js",
          "name":"main.js",
          "type":"file"
        },
        {
          "dir":"myProject/js",
          "name":"models",
          "type":"folder",
          "children":[
            {
              "dir":"myProject/js/models",
              "name":"menu.js",
              "type":"file"
            },
            {
              "dir":"myProject/js/models",
              "name":"user.js",
              "type":"file"
            },
            {
              "dir":"myProject/js/models",
              "name":"users.js",
              "type":"file"
            }
          ]
        }
      ]
    },
    {
      "dir":"myProject",
      "name":"ressources",
      "type":"folder"
    },
    {
      "dir":"myProject",
      "name":"views",
      "type":"folder",
      "children":[
        {
          "dir":"myProject/templates",
          "name":"core",
          "type":"folder",
          "children":[
            {
              "dir":"myProject/templates/core",
              "name":"footer.html",
              "type":"file"
            },
            {
              "dir":"myProject/templates/core",
              "name":"header.html",
              "type":"file"
            },
            {
              "dir":"myProject/templates/core",
              "name":"menu.html",
              "type":"file"
            }
          ]
        },
        {
          "dir":"myProject/templates",
          "name":"errors",
          "type":"folder",
          "children":[
            {
              "dir":"myProject/templates/errors",
              "name":"error401.html",
              "type":"file"
            },
            {
              "dir":"myProject/templates/errors",
              "name":"error403.html",
              "type":"file"
            },
            {
              "dir":"myProject/templates/errors",
              "name":"error404.html",
              "type":"file",
              "corrupted":true
            }
          ]
        },
        {
          "dir":"myProject/templates",
          "name":"home",
          "type":"folder",
          "children":[
            {
              "dir":"myProject/templates/home",
              "name":"homePage.html",
              "type":"file"
            }
          ]
        },
        {
          "dir":"myProject/templates",
          "name":"home",
          "type":"folder",
          "children":[
            {
              "dir":"myProject/templates/user",
              "name":"list.html",
              "type":"file"
            },
            {
              "dir":"myProject/templates/user",
              "name":"login.html",
              "type":"file"
            },
            {
              "dir":"myProject/templates/user",
              "name":"profile.html",
              "type":"file"
            },
            {
              "dir":"myProject/templates/user",
              "name":"subscribe.html",
              "type":"file"
            }
          ]
        }
      ]
    }
  ]
}

我的 JS 代码:

var treeModule;

treeModule = document.getElementById("json").innerHTML;
treeModule = JSON.parse(treeModule);
console.log(treeModule);


function Recursive(objetJS, isFirstParent) {
    var list = document.createElement("ul");

    for(let child of objetJS.children) {
        var item = document.createElement("li");
        item.innerHTML = child.name;
        item.setAttribute('type', child.type);
        console.log(child.name);

        if(typeof(child.children) == "object") {
            Recursive(child, false);
        }
        list.appendChild(item);
    }
    if(list.parentElement != null) {
        item.appendChild(list);
    }
    if(isFirstParent == true) {
        var htmlElement = document.getElementById("html");
        htmlElement.innerHTML = '';
        htmlElement.appendChild(list);
    }
}
Recursive(treeModule, true);

最佳答案

我建议给函数一个节点,以附加内容。对于递归,采用下一次调用的实际节点。

function recursive(object, node) {
    var list = document.createElement("ul");
    for (let child of object.children) {
        var item = document.createElement("li");
        item.innerHTML = child.name;
        item.setAttribute('type', child.type);
        if (typeof(child.children) == "object") {
            recursive(child, item);
        }
        list.appendChild(item);
    }
    if (list.parentElement != null) {
        item.appendChild(list);
    }
    node.appendChild(list);
}

var treeModule = { dir: "", name: "myProject", type: "folder", children: [{ dir: "myProject", name: "css", type: "folder", children: [{ dir: "myProject/css", name: "main.css", type: "file" }, { dir: "myProject/css", name: "menu.css", type: "file" }, { dir: "myProject/css", name: "user.css", type: "file" }] }, { dir: "myProject", name: "fonts", type: "folder" }, { dir: "myProject", name: "images", type: "folder", children: [{ dir: "myProject/images", name: "logo.png", type: "file", corrupted: true }] }, { dir: "myProject", name: "index.html", type: "file" }, { dir: "myProject", name: "js", type: "folder", children: [{ dir: "myProject/js", name: "controllers", type: "folder", children: [{ dir: "myProject/js/controllers", name: "core", type: "folder", children: [{ dir: "myProject/tempjs/controllerslates/core", name: "menu.js", type: "file" }] }, { dir: "myProject/js/controllers", name: "errors", type: "folder", children: [{ dir: "myProject/js/controllers/errors", name: "error.js", type: "file" }] }, { dir: "myProject/js/controllers", name: "home", type: "folder", children: [{ dir: "myProject/js/controllers/home", name: "homePage.js", type: "file" }] }, { dir: "myProject/js/controllers", name: "home", type: "folder", children: [{ dir: "myProject/js/controllers/user", name: "list.js", type: "file" }, { dir: "myProject/js/controllers/user", name: "login.js", type: "file" }, { dir: "myProject/js/controllers/user", name: "profile.js", type: "file" }, { dir: "myProject/js/controllers/user", name: "subscribe.js", type: "file" }] }] }, { dir: "myProject/js", name: "libs", type: "folder", children: [{ dir: "myProject/js/libs", name: "handlebars.min.js", type: "file" }, { dir: "myProject/js/libs", name: "jquery.min.js", type: "file" }, { dir: "myProject/js/libs", name: "require.min.js", type: "file", corrupted: true }] }, { dir: "myProject/js", name: "main.js", type: "file" }, { dir: "myProject/js", name: "models", type: "folder", children: [{ dir: "myProject/js/models", name: "menu.js", type: "file" }, { dir: "myProject/js/models", name: "user.js", type: "file" }, { dir: "myProject/js/models", name: "users.js", type: "file" }] }] }, { dir: "myProject", name: "ressources", type: "folder" }, { dir: "myProject", name: "views", type: "folder", children: [{ dir: "myProject/templates", name: "core", type: "folder", children: [{ dir: "myProject/templates/core", name: "footer.html", type: "file" }, { dir: "myProject/templates/core", name: "header.html", type: "file" }, { dir: "myProject/templates/core", name: "menu.html", type: "file" }] }, { dir: "myProject/templates", name: "errors", type: "folder", children: [{ dir: "myProject/templates/errors", name: "error401.html", type: "file" }, { dir: "myProject/templates/errors", name: "error403.html", type: "file" }, { dir: "myProject/templates/errors", name: "error404.html", type: "file", corrupted: true }] }, { dir: "myProject/templates", name: "home", type: "folder", children: [{ dir: "myProject/templates/home", name: "homePage.html", type: "file" }] }, { dir: "myProject/templates", name: "home", type: "folder", children: [{ dir: "myProject/templates/user", name: "list.html", type: "file" }, { dir: "myProject/templates/user", name: "login.html", type: "file" }, { dir: "myProject/templates/user", name: "profile.html", type: "file" }, { dir: "myProject/templates/user", name: "subscribe.html", type: "file" }] }] }] };

recursive({ children: [treeModule] }, document.getElementById("tree"));
<div id="tree"></div>

关于javascript - 递归函数创建树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40170835/

相关文章:

java - 我应该如何在Java中实现这种树状概念?

python - 使用python获取二叉树中给定级别的所有节点

javascript - 调整 Canvas 质量以达到预定的图像文件大小

javascript - 使用 jquery .css() 时 rotateY 不起作用

python - 通过其父项修改嵌套字典键名

python - 决策树中的递归编程

algorithm - 使用 +、- 运算符平衡算术表达式树

javascript - 绘制垂直线和水平带

javascript - Google Maps API 风格的 map - 颜色问题

algorithm - 杀死每个弓箭手所需的最少火球数量?