javascript – 如何从JSON数据递归创建UL/LI – 多层深层

前端之家收集整理的这篇文章主要介绍了javascript – 如何从JSON数据递归创建UL/LI – 多层深层前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用以下 JSON数据在递归内部函数中创建以下类似的结构,运气不大,真的需要一些帮助,所以如果有人可以协助请做.先感谢您.
  1. <ul>
  2. <li></li>
  3. <li>
  4. <a href=""></a>
  5. <div>
  6. <ul>
  7. <li>
  8. <a href=""></a>
  9. <div>
  10. ....etc
  11. </div>
  12. </li>
  13. </ul>
  14. </div>
  15. </li>
  16. </ul>

我使用的JSON数据如下:

  1. var JSON = {
  2. menu: [
  3. {id: '0',sub: [
  4. {name: 'lorem ipsum 0-0',link: '0-0',sub: null},{name: 'lorem ipsum 0-1',link: '0-1',{name: 'lorem ipsum 0-2',link: '0-2',sub: null}
  5. ]
  6. },{id: '1',{id: '2',sub: [
  7. {name: 'lorem ipsum 2-0',link: '2-0',{name: 'lorem ipsum 2-1',link: '2-1',{name: 'lorem ipsum 2-2',link: '2-2',sub: [
  8. {name: 'lorem ipsum 2-2-0',link: '2-2-0',{name: 'lorem ipsum 2-2-1',link: '2-2-1',{name: 'lorem ipsum 2-2-2',link: '2-2-2',{name: 'lorem ipsum 2-2-3',link: '2-2-3',{name: 'lorem ipsum 2-2-4',link: '2-2-4',{name: 'lorem ipsum 2-2-5',link: '2-2-5',{name: 'lorem ipsum 2-2-6',link: '2-2-6',sub: null}
  9. ]},{name: 'lorem ipsum 2-3',link: '2-3',{name: 'lorem ipsum 2-4',link: '2-4',{name: 'lorem ipsum 2-5',link: '2-5',{id: '3',sub: null}
  10. ]
  11. }

我创建的代码(不完整,这是我需要帮助的脑筋急转弯)是:

  1. $(function(){
  2.  
  3. $.fn.dropdown = function(settings){
  4. var that = this;
  5. var settings = $.extend({},$.fn.dropdown.defaults,settings);
  6. var methods = {
  7. isArray: function(o){
  8. return Object.prototype.toString.call(o) === '[object Array]';
  9. },createDropdownCode: function(arr){
  10. var menu = arr.menu;
  11. var html = null;
  12. var menusort = function(menu){
  13. html = that;
  14.  
  15. that.find("li").each(function(idx){
  16.  
  17. var menuList = menu[idx].sub;
  18. var baseContainer = $(this);
  19. var count = -1;
  20.  
  21. var subsort = (function(){
  22.  
  23. count += 1;
  24.  
  25. return function(submenu,pb){
  26.  
  27. var subblock;
  28. subblock = $("<div />").append('<ul />');
  29.  
  30. if(methods.isArray(submenu)){
  31.  
  32. for(var i=0;i<submenu.length;i++){
  33.  
  34. var l = $("<li />").append("<a href='"+ submenu[i].link +"'>"+ submenu[i].name +"</a>");
  35.  
  36. subblock.find('ul').append(l);
  37.  
  38. if(pb !== undefined && i == submenu.length-1){
  39. pb.append(subblock)
  40. }
  41.  
  42. if(methods.isArray(submenu[i].sub)){
  43. subsort(submenu[i].sub,subblock.find('ul li').eq(i));
  44. }
  45.  
  46. }
  47. }
  48. }
  49. })()
  50. subsort(menuList)
  51. })
  52. }
  53. menusort(menu);
  54. return null; //html !== null ? html.html() : null;
  55. },init: function(){
  56.  
  57. // filter through json
  58. // create the div=>ul=>li
  59. if(settings.jsonData === undefined || settings.jsonData === null){
  60. console.warn('No JSON Data passed')
  61. return;
  62. }else{
  63. if(!methods.isArray(settings.jsonData.menu)){
  64. console.warn('No JSON Data passed')
  65. return; // error,no data!
  66. }
  67. }
  68.  
  69.  
  70. //var html = methods.createBlock(settings.jsonData.menu[0].sub);
  71. var html = methods.createDropdownCode(settings.jsonData);
  72. //console.log(html)
  73. }
  74. }
  75.  
  76. methods.init();
  77.  
  78. return that;
  79.  
  80. }
  81.  
  82. $.fn.dropdown.defaults = {
  83. jsonData: null
  84. }
  85.  
  86. })
  87.  
  88. $('#menu').dropdown({
  89. jsonData: JSON
  90. });

使用综合代码,感谢个人提供了足够接近的答案 – 虽然会研究其他人.

  1. $.fn.dropdown = function(settings){
  2.  
  3. var that = this;
  4. var settings = $.extend({},settings);
  5.  
  6. var methods = {
  7. createDropDownCode: function(arr){
  8.  
  9. // loop through li's of primary menu
  10. that.find("li").each(function(idx){
  11.  
  12. $(this).append( menusort(arr.menu[idx].sub) );
  13.  
  14. function menusort(data){
  15. if(data !== null)
  16. var html = "<div><ul>";
  17.  
  18. for(item in data){
  19. html += "<li>";
  20. if(typeof(data[item].sub) === 'object'){
  21. html += "<a href='" + data[item].link + "'>" + data[item].name + "</a>";
  22. if($.isArray(data[item].sub))
  23. html += menusort(data[item].sub);
  24. }
  25. html += "</li>"
  26. }
  27. if(data !== null)
  28. html += "</ul></div>";
  29. return html;
  30. }
  31. })
  32. },init: function(){
  33. var html = methods.createDropDownCode(settings.jsonData);
  34.  
  35. }
  36. }
  37.  
  38. methods.init();
  39.  
  40. }

解决方法

您可以尝试我刚刚编写的这个递归函数
  1. function buildList(data,isSub){
  2. var html = (isSub)?'<div>':''; // Wrap with div if true
  3. html += '<ul>';
  4. for(item in data){
  5. html += '<li>';
  6. if(typeof(data[item].sub) === 'object'){ // An array will return 'object'
  7. if(isSub){
  8. html += '<a href="' + data[item].link + '">' + data[item].name + '</a>';
  9. } else {
  10. html += data[item].id; // Submenu found,but top level list item.
  11. }
  12. html += buildList(data[item].sub,true); // Submenu found. Calling recursively same method (and wrapping it in a div)
  13. } else {
  14. html += data[item].id // No submenu
  15. }
  16. html += '</li>';
  17. }
  18. html += '</ul>';
  19. html += (isSub)?'</div>':'';
  20. return html;
  21. }

它返回菜单的html,所以使用它:var html = buildList(JSON.menu,false);

我相信它更快,因为它是纯JavaScript,并且它不会为每次迭代创建文本节点或DOM元素.只需在完成后调用.innerHTML或$(‘…’).html(),而不是立即为每个菜单添加HTML.

JSFiddled:http://jsfiddle.net/remibreton/csQL8/

猜你在找的JavaScript相关文章