Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中递归生成菜单和子菜单?_Javascript_Json_Recursion - Fatal编程技术网

如何在JavaScript中递归生成菜单和子菜单?

如何在JavaScript中递归生成菜单和子菜单?,javascript,json,recursion,Javascript,Json,Recursion,我想使递归和动态的功能,渲染导航菜单和子菜单 我有一个JSON对象数组,其中每个对象都是菜单项,菜单项可以有子菜单,子菜单也可以有子菜单……我想你们理解我的逻辑 当前,每个对象都有标题和子菜单对象(可选) JSON对象 [ { title: "menu 1" submenus: [ { title: "sub menu1" }, { title: "sub menu2"

我想使递归和动态的功能,渲染导航菜单和子菜单

我有一个JSON对象数组,其中每个对象都是菜单项,菜单项可以有子菜单,子菜单也可以有子菜单……我想你们理解我的逻辑

当前,每个对象都有标题和子菜单对象(可选)

JSON对象

[
{
    title: "menu 1"
    submenus: [
        {
            title: "sub menu1"
        },
        {
            title: "sub menu2"
            submenus: [
                {
                    title: "subsub menu1"
                    submenus: [
                        {
                            title: "susubsub menu1"
                        }
                    ]
                },
                {
                    title: 'subsub menu2"
                }
            ]
        }
    ]
},
{
    title: "menu 2"
}]
你知道怎么做吗?

示例:

  var a = {
  "menu1": {
     title: "menu1"
   },
   "menu2": {
     title: "menu2",
     submenu: {
       "menu3" : {
          title : "menu3"
        },
       "menu4": {
         title: "menu4",
         submenu: {
          "menu5": {
           title: "menu5"
         }
       }
     }
   }
  }
 }



 function printMenu(menu){
     if(!menu) return "";

     var str = "";
     for(var i in menu)
     {
         if(menu[i].submenu)
            str+= "<li>"+menu[i].title+"<ul>"+printMenu(menu[i].submenu)+"</ul></li>";
         else
            str+= "<li>"+menu[i].title+"</li>";
     }
     return str;
 };

printMenu(a); // "<li>menu1</li><li>menu2<ul><li>menu3</li><li>menu4<ul><li>menu5</li></ul></li></ul></li>"
例如:

  var a = {
  "menu1": {
     title: "menu1"
   },
   "menu2": {
     title: "menu2",
     submenu: {
       "menu3" : {
          title : "menu3"
        },
       "menu4": {
         title: "menu4",
         submenu: {
          "menu5": {
           title: "menu5"
         }
       }
     }
   }
  }
 }



 function printMenu(menu){
     if(!menu) return "";

     var str = "";
     for(var i in menu)
     {
         if(menu[i].submenu)
            str+= "<li>"+menu[i].title+"<ul>"+printMenu(menu[i].submenu)+"</ul></li>";
         else
            str+= "<li>"+menu[i].title+"</li>";
     }
     return str;
 };

printMenu(a); // "<li>menu1</li><li>menu2<ul><li>menu3</li><li>menu4<ul><li>menu5</li></ul></li></ul></li>"

下面是一个关于如何使用递归进入JSON中每个菜单和子菜单的示例:

var myJson='[{标题:菜单1,子菜单:['+ “{title:sub menu1},”+ {标题:子菜单2,子菜单:[”+ “{title:subsub menu1,子菜单:[{title:susubsub menu1}]},”+ “{标题:子菜单2}”+ ']}]},'+ “{标题:菜单2}]”; var obj=JSON.parsemyJson; 函数递归对象{ ifobject{ forvar i=0;i递归OBJ 下面是一个关于如何使用递归进入JSON中每个菜单和子菜单的示例:

var myJson='[{标题:菜单1,子菜单:['+ “{title:sub menu1},”+ {标题:子菜单2,子菜单:[”+ “{title:subsub menu1,子菜单:[{title:susubsub menu1}]},”+ “{标题:子菜单2}”+ ']}]},'+ “{标题:菜单2}]”; var obj=JSON.parsemyJson; 函数递归对象{ ifobject{ forvar i=0;i递归OBJ 有几个JavaScript库可以使用各种视觉辅助工具生成动态菜单。但如果您自己实施,您将使用以下成分:

一个容器HTML元素,菜单应该放在其中。 一个JavaScript递归函数,用于为菜单创建DOM元素并将它们放置在容器元素中 单击通过样式切换子菜单可见性的处理程序 CSS为菜单提供一些视觉线索,并提供显示或隐藏子菜单的样式 例如:

函数populateMenucontainer,菜单{ if!menu | |!menu.length返回; const ul=document.createElementul; 对于菜单的常量{title,子菜单}{ const li=document.createElementli; li.textContent=标题; li.className=leaf; 如果子菜单{ populateMenuli,子菜单,true; li.className=崩溃; li.addEventListenerclick,e=>{ 如果e.target!==e.currentTarget返回; e、 target.classList.toggleexpanded; e、 target.classList.togglecollapsed; }; } ul.appendChildli; } 容器。儿童; } //菜单定义示例: 常量菜单=[{title:menu1,子菜单:[{title:sub menu1},{title:sub menu2,子菜单:[{title:subsubsub menu1,子菜单:[{title:susubsub menu1}]},{title:subsubsub menu2}]},{title:menu2}]; //提供应插入菜单的DOM元素: populateMenudocument.GetElementById菜单,菜单; li.collapsed>ul{display:none} ul{光标:指针} 李。崩溃了,李。扩大了,李。叶{ 位置:相对位置; 列表样式类型:无; 文本缩进:-2em; } li.扩展:在{content:'− ' } li.collapsed:在{content:'+'}之前 li.leaf:在{content:'○ ' }
有几个JavaScript库可以生成带有各种视觉辅助的动态菜单。但如果您自己实现它,您将使用以下成分:

一个容器HTML元素,菜单应该放在其中。 一个JavaScript递归函数,用于为菜单创建DOM元素并将它们放置在容器元素中 单击通过样式切换子菜单可见性的处理程序 CSS为菜单提供一些视觉线索,并提供显示或隐藏子菜单的样式 例如:

函数populateMenucontainer,菜单{ if!menu | |!menu.length返回; const ul=document.createElementul; 对于菜单的常量{title,子菜单}{ const li=document.createElementli; li.textContent=标题; li.className=leaf; 如果子菜单{ populateMenuli,子菜单,true; li.className=崩溃; li.addEventListenerclick,e=>{ 如果e.target!==e.currentTarget返回; e、 target.classList.toggleexpanded; e、 target.classList.togglecollapsed; }; } ul.appendChildli; } 容器。儿童; } //菜单定义示例: 常量菜单=[{title:menu1,子菜单:[{title:sub menu1},{title:sub menu2,子菜单:[{title:subsubsub menu1,子菜单:[{title:susubsub menu1}]},{title:subsubsub menu2}]},{title:menu2}]; //提供DOM元素,其中 应插入以下内容: populateMenudocument.GetElementById菜单,菜单; li.collapsed>ul{display:none} ul{光标:指针} 李。崩溃了,李。扩大了,李。叶{ 位置:相对位置; 列表样式类型:无; 文本缩进:-2em; } li.扩展:在{content:'− ' } li.collapsed:在{content:'+'}之前 li.leaf:在{content:'○ ' }
遍历N级嵌套数组列表,并根据需要在递归函数中编写逻辑代码

我实现了这段代码,用于为PrimeNG的上下文菜单生成菜单列表

JSON数据-

    [
      {
        "TITLE": "parent1",
        "SUBMENU": [
          {
            "SUBMENU": [
              {
                "SUBMENU": [
                  {
                    "TITLE": "Child 1"
                  }
                ]
              },
              {
                "SUBMENU": [
                  {
                    "TITLE": "Child 3"
                  }
                ]
              },
              {
                "SUBMENU": [
                  {
                    "SUBMENU": [
                      {
                        "TITLE": "Child 4"
                      }
                    ]
                  },
                  {
                    "SUBMENU": [

                    ]
                  }
                ],

              },
              {
                "SUBMENU": [
                  {
                    "SUBMENU": [

                    ]
                  }
                ]
              }
            ],

          }
        ],

      },
      {
        "TITLE": "parent2",
        "SUBMENU": [
          {
            "TITLE": "Child 4"
          }
        ],

      }
    ]
JAVASCRIPT/Typescript代码-

traveRecusrivelist(object: any[]): any[] {
    if (object) {
      let newList: any[] = [];
      for (var i = 0; i < object.length; i++) {
        if (object[i].ITEMS && object[i].ITEMS.length > 0) {
            // TODO : code you logic here
           // create your own object and push in the newList array
          let returnedList = this.traveRecusrivelist(object[i].ITEMS);
          // Example : PrimeNG MenuItem creation
          // newList.push({ label: object[i].TITLE, items: returnedList, command: (event) => { } });
          newList.push(returnedList);
        }
        else {
            // TODO : code you logic here
           // example : PrimeNG menuItem 
           // newList.push({ label: object[i].TITLE, command: (event) => { } });
           // create your own object and push in the newList array
              newList.push(object[i]);
        }
      }
      return newList;
    }
  }

let list: any[] = [];
list = this.traveRecusrivelist(object);
console.log(list);

遍历N级嵌套数组列表,并根据需要在递归函数中编写逻辑代码

我实现了这段代码,用于为PrimeNG的上下文菜单生成菜单列表

JSON数据-

    [
      {
        "TITLE": "parent1",
        "SUBMENU": [
          {
            "SUBMENU": [
              {
                "SUBMENU": [
                  {
                    "TITLE": "Child 1"
                  }
                ]
              },
              {
                "SUBMENU": [
                  {
                    "TITLE": "Child 3"
                  }
                ]
              },
              {
                "SUBMENU": [
                  {
                    "SUBMENU": [
                      {
                        "TITLE": "Child 4"
                      }
                    ]
                  },
                  {
                    "SUBMENU": [

                    ]
                  }
                ],

              },
              {
                "SUBMENU": [
                  {
                    "SUBMENU": [

                    ]
                  }
                ]
              }
            ],

          }
        ],

      },
      {
        "TITLE": "parent2",
        "SUBMENU": [
          {
            "TITLE": "Child 4"
          }
        ],

      }
    ]
JAVASCRIPT/Typescript代码-

traveRecusrivelist(object: any[]): any[] {
    if (object) {
      let newList: any[] = [];
      for (var i = 0; i < object.length; i++) {
        if (object[i].ITEMS && object[i].ITEMS.length > 0) {
            // TODO : code you logic here
           // create your own object and push in the newList array
          let returnedList = this.traveRecusrivelist(object[i].ITEMS);
          // Example : PrimeNG MenuItem creation
          // newList.push({ label: object[i].TITLE, items: returnedList, command: (event) => { } });
          newList.push(returnedList);
        }
        else {
            // TODO : code you logic here
           // example : PrimeNG menuItem 
           // newList.push({ label: object[i].TITLE, command: (event) => { } });
           // create your own object and push in the newList array
              newList.push(object[i]);
        }
      }
      return newList;
    }
  }

let list: any[] = [];
list = this.traveRecusrivelist(object);
console.log(list);

请添加said JSON。@JackBashford我添加了JSON数组。到目前为止,您尝试了什么?请发布您解决手头问题的最佳尝试,以便人们能够实际帮助您改进您的解决方案。我尝试了一些方法,但我意识到我不知道如何解决。这就是我搜索解决方案的原因。请添加said JSON。@JackBashford我添加了JSON数组到目前为止,你有没有尝试过?请发布你解决手头问题的最佳尝试,这样人们才能真正帮助你改进你的解决方案我尝试了一些东西,但我意识到我不知道如何解决这个问题。这就是为什么我在寻找解决方案我也喜欢,以那种方式运行递归我也喜欢,以那种方式运行递归