javascript - 从嵌套数组创建 UL

标签 javascript

我正在大学学习 JS 入门类(class),我必须构建一个 <ul>通过 JS 嵌套数组。我已经构建了一个 <ol>使用常规数组作为作业的第一部分。这就是我所做的:

window.onload = function(){

    fruits.sort();

    var ol = "<ol>"
    for(var i = 0; i < fruits.length; i++){
        ol+= "<li>" + fruits[i] + "</li>"
    }ol += "</ol>"

    var myContainer = document.querySelector("#olContainer").innerHTML = ol;
};

对于这个数组:

var fruits = [ "Apples","Oranges","Pears","Grapes","Pineapples","Mangos" ];

我正在使用的当前嵌套数组是这样的:

var directory = [
    {type: "file", name: "file1.txt"},
    {type: "file", name: "file2.txt"},
    {type: "directory", name: "HTML Files", files: [{type: "file", name: "file1.html"},{type: "file", name: "file2.html"}]},
    {type: "file", name: "file3.txt"},
    {type: "directory", name: "JavaScript Files", files: [{type: "file", name: "file1.js"},{type: "file", name: "file2.js"},{type: "file", name: "file3.js"}]}
];

我认为使用 switch 语句会更好,但我不知道如何迭代每一行代码并提取嵌套列表以将它们缩进为子列表。我需要在之前的 JS 函数的基础上构建 <ol>列表

最佳答案

递归!它基本上是一个在特定条件之前调用自身的函数,更多详细信息:https://www.sitepoint.com/recursion-functional-javascript/

Recursion is a technique for iterating over an operation by having a function call itself repeatedly until it arrives at a result. Most loops can be rewritten in a recursive style, and in some functional languages this approach to looping is the default.

您通过了 directory到函数并循环遍历第一级值(如果它是 file)您将其添加到列表中,否则您调用相同的函数,但传递第二级列表,即值(文件列表),添加另一个嵌套 ul ,等等..

请参阅下面的代码片段(基于您之前针对 <ol> 列表的 JS 函数)

var directory = [
    {type: "file", name: "file1.txt"},
    {type: "file", name: "file2.txt"},
    {type: "directory", name: "HTML Files", files: [{type: "file", name: "file1.html"},{type: "file", name: "file2.html"}]},
    {type: "file", name: "file3.txt"},
    {type: "directory", name: "JavaScript Files", files: [{type: "file", name: "file1.js"},{type: "file", name: "file2.js"},{type: "file", name: "file3.js"}]}
];

function createUl(list){
	
    var myUl = "<ul>";

    for(var i = 0; i < list.length; i++){
      if(list[i].type == "file")
        myUl+= "<li>" + list[i].name + "</li>";
      else{ // it's a directory
        myUl+= "<li>" + list[i].name + "</li>";
        myUl += createUl(list[i].files); // call the same function with the list of files
      }
    }

    myUl += "</ul>";
    
    return myUl;
}

var ulList = createUl(directory);
document.querySelector("#ulContainer").innerHTML = ulList;
<div id="ulContainer">

</div>

关于javascript - 从嵌套数组创建 UL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49583576/

相关文章:

javascript - Sequelize.js 插入一个具有一对多关系的模型

javascript - 我应该使用什么脚本来实现平滑的 anchor 滚动?我试过的都不起作用

php - 在php mysql查询中添加javascript

javascript - 如何解决 webpack 2 错误,模块构建失败 :SyntaxError, ,?

javascript - 我的 AngularJS 应用程序中的过滤结果不准确

javascript - 使用 Javascript 根据表单输入创建一个新的 div 实例

javascript - js验证只运行一次

javascript - 在单个模块中声明时 Controller 未定义

javascript document.write css 不适用

javascript - 从外部 JS 文件动态读取所有变量