2016-11-15 98 views
0

如何根据“id”和“pid”从我的JSON创建嵌套菜单(带有“sub-sub-sub ...- n”)项目?json的多级嵌套菜单

代码细节:

id - item ID 
lvl - level of the item 
pid - parent ID of the item 
pos - position of the item 
nm - name of the item 

JSON:

[{"id":1,"lvl":0,"pid":0,"pos":0,"nm":"HomeTree"}, 
{"id":5,"lvl":1,"pid":1,"pos":0,"nm":"Books"}, 
{"id":2,"lvl":1,"pid":1,"pos":1,"nm":"Jobs"}, 
{"id":16,"lvl":1,"pid":1,"pos":2,"nm":"Music"}, 
{"id":17,"lvl":2,"pid":16,"pos":0,"nm":"Relax Sets"}, 
{"id":12,"lvl":1,"pid":1,"pos":3,"nm":"Cars"}, 
{"id":13,"lvl":2,"pid":12,"pos":0,"nm":"BMW"}, 
{"id":14,"lvl":1,"pid":1,"pos":4,"nm":"Web"}, 
{"id":15,"lvl":2,"pid":14,"pos":0,"nm":"PHP Analytics"}, 
{"id":18,"lvl":1,"pid":1,"pos":5,"nm":"Hardware"}, 
{"id":19,"lvl":2,"pid":18,"pos":0,"nm":"EVGA SR2 Upgrades"}, 
{"id":31,"lvl":2,"pid":18,"pos":1,"nm":"Keyboards"}, 
{"id":20,"lvl":1,"pid":1,"pos":6,"nm":"Movies"}, 
{"id":21,"lvl":1,"pid":1,"pos":7,"nm":"Games"}, 
{"id":22,"lvl":1,"pid":1,"pos":8,"nm":"Robots"}, 
{"id":25,"lvl":1,"pid":1,"pos":9,"nm":"Magazines"}, 
{"id":26,"lvl":2,"pid":25,"pos":0,"nm":"IT Security"}, 
{"id":27,"lvl":1,"pid":1,"pos":10,"nm":"Management"}, 
{"id":28,"lvl":2,"pid":27,"pos":0,"nm":"Holacracy"}, 
{"id":29,"lvl":3,"pid":28,"pos":0,"nm":"Testtt"}] 

我需要什么:

HomeTree 
    Books 
    Jobs 
    Music 
    Relax Sets 
    Cars 
     BMW 
    Web 
     PHP Analytics 
    Hardware 
     EVGA SR2 Upgrades 
    Keyboards 
    Movies 
    Games 
    Robots 
    Magazines 
     IT Security 
    Management 
     Holacracy 
      Testtt 

我当前的代码:

$.ajax({ 
    url: './jstree_head.php?operation=full_tree', 
    data: "", 
    dataType: 'json', 
    success: function(data) 
    { 
     var output="<br />"; 
     for (var i in data) 
     { 
       var rid = data[i].id; 
       var rpid = data[i].pid; 
       var rlvl = data[i].lvl; 
       var rnm = data[i].nm; 

       var nest = '&nbsp; &nbsp; &nbsp;'; 
       if(rpid > 1) { 
           nm = nest+rnm+'<br>'; 
          } 
       else {nm = rnm+'<br>';} 

      output+='' + nm + ''; 
     } 
     $('#content').html(output); 
    } 
}); 

现在我不能说明深层次的子层次,那么正确的方法是什么?

--- UPDATE ---

我想的是:

var nest = '&nbsp; &nbsp; &nbsp;'; 
if(rpid > 1) { 
    nm = nest+rnm+'<br>'; 
} 
else {nm = rnm+'<br>';} 

output+='' + nm + ''; 

但这只是一个级别的父项。

+0

以我当前的代码:'VAR巢= '     '; if(rpid> 1)nm = nest + rnm +'
'; } else {nm = rnm +'
';} output + =''+ nm +'';' – mastrdevl

+0

请更新您的问题, – Soviut

+0

谢谢!我已经做了。 – mastrdevl

回答

0

由于你的输出没有格式化,我首先创建了一个父子子层次,然后用它来打印输出。不是直接将值存储在字符串中,而是使用JSON,因为在那里动态添加子元素更容易。

var data = [{"id":1,"lvl":0,"pid":0,"pos":0,"nm":"HomeTree"}, 
    {"id":5,"lvl":1,"pid":1,"pos":0,"nm":"Books"}, 
    {"id":2,"lvl":1,"pid":1,"pos":1,"nm":"Jobs"}, 
    {"id":16,"lvl":1,"pid":1,"pos":2,"nm":"Music"}, 
    {"id":17,"lvl":2,"pid":16,"pos":0,"nm":"Relax Sets"}, 
    {"id":12,"lvl":1,"pid":1,"pos":3,"nm":"Cars"}, 
    {"id":13,"lvl":2,"pid":12,"pos":0,"nm":"BMW"}, 
    {"id":14,"lvl":1,"pid":1,"pos":4,"nm":"Web"}, 
    {"id":15,"lvl":2,"pid":14,"pos":0,"nm":"PHP Analytics"}, 
    {"id":18,"lvl":1,"pid":1,"pos":5,"nm":"Hardware"}, 
    {"id":19,"lvl":2,"pid":18,"pos":0,"nm":"EVGA SR2 Upgrades"}, 
    {"id":31,"lvl":2,"pid":18,"pos":1,"nm":"Keyboards"}, 
    {"id":20,"lvl":1,"pid":1,"pos":6,"nm":"Movies"}, 
    {"id":21,"lvl":1,"pid":1,"pos":7,"nm":"Games"}, 
    {"id":22,"lvl":1,"pid":1,"pos":8,"nm":"Robots"}, 
    {"id":25,"lvl":1,"pid":1,"pos":9,"nm":"Magazines"}, 
    {"id":26,"lvl":2,"pid":25,"pos":0,"nm":"IT Security"}, 
    {"id":27,"lvl":1,"pid":1,"pos":10,"nm":"Management"}, 
    {"id":28,"lvl":2,"pid":27,"pos":0,"nm":"Holacracy"}, 
    {"id":29,"lvl":3,"pid":28,"pos":0,"nm":"Testtt"}]; 

var output="<br />"; 

var res = []; 
function createRelationship(){ 
    for (var i in data) 
    { 
     if(data[i].pid == 0 && data[i].id == 1){ 
      res.push({ 
      id: data[i].id, 
      nm: data[i].nm 
      }); 
     } 
     else{ 
      var parent = findParent(data[i].pid, res); 
      if(parent){ 
       if(!parent.items){ 
        parent.items = []; 
       } 
       parent.items.push({ 
        id: data[i].id, 
        nm: data[i].nm 
       }); 
      } 
     } 
    } 
} 

function findParent(pid, _res){ 
    if(_res){ 
     if(_res.id == pid){ 
      return _res; 
     } 
     var len = _res.length ? _res.length : _res.items ? _res.items.length : 0; 
     for(var i =0; i< len; i++){ 
      if(_res[i] && _res[i].id == pid){ 
       return _res[i]; 
      } 
      else{ 
       var child = _res[i] ? _res[i] : _res; 
       if(child){ 
        for(var j=0;j<child.items.length;j++){ 
         var res = findParent(pid, child.items[j]); 
         if(res){ 
          return res; 
         } 
        } 
       } 
      } 
     } 
    } 
    return null; 
} 



function printOutPut(obj, spaceCount){ 
    var space = ''; 
    for(var i = 0; i< spaceCount; i++){ 
     space+= '&nbsp;'; 
    } 
    output += space + obj.nm; 
    output += "<br />"; 
    if(obj.items){ 
     for(i = 0; i < obj.items.length; i++){ 
      printOutPut(obj.items[i], (spaceCount + 4)); 
     } 
    } 
} 

createRelationship(); 

for(var z =0; z<res.length;z++){ 
    printOutPut(res[z], 1); 
} 

document.write(output); 
+0

哇!我没想到和平面阵列一起工作会非常复杂: 这就是为什么我无法使它工作 - 逻辑对我来说太复杂了谢谢PK我非常感谢你的帮助,如果你没有对服务器端代码进行任何控制,那么你已经想出了这个复杂的代码。 – mastrdevl

+0

是的,这就是为什么理想的方法是从服务器本身发送格式化的JSON对象。需要在这里像这样在客户端格式化它。 – Piyush

0

由于您的数据是一个平面数组,而不是嵌套的JSON对象,所以不能使用递归函数。

相反,您可以遍历所有元素,跟踪父类列表,因为lvl属性发生更改。随着lvl的增加,请将以前的元素添加到父母列表中,并为以下所有项目使用此最新父项。随着lvl减少,请从列表中删除最新的父项,并将其在列表中使用之前的项目,而不是所有后续项目。