简体   繁体   English

如何在javaScript中实现分层的多级数据表?

[英]How to implement hierarchical multilevel datatable in javaScript?

I am implementing multi level datatable without using any plugin or library. 我在不使用任何插件或库的情况下实现多级数据表。 I want to implement based on javaScript, JQuery or angular js. 我想基于javaScript,JQuery或angular js实现。 I checked one below links, 我检查了以下链接之一,

Traverse all the Nodes of a JSON Object Tree with JavaScript 使用JavaScript遍历JSON对象树的所有节点

nested table using ng-repeat 使用ng-repeat嵌套表格

But my json structure is different from above link. 但是我的json结构与上面的链接不同。

I need to display my JSON in Tree Structure UI. 我需要在“树形结构” UI中显示我的JSON。 I don't hard code level in html. 我没有html的硬编码级别。 All level should be handle by javascript. 所有级别均应使用javascript处理。

I have implemented jsfiddle: http://jsfiddle.net/varunPes/0n9fmawb/40/ 我已经实现了jsfiddle: http : //jsfiddle.net/varunPes/0n9fmawb/40/

JSON STRUCTURE JSON结构

[  {
      Home:{
                "checkbox_view":true,
                "checkbox_edit":false,
                "checkbox_delete":true
      }
   },
   {  
      "watchColorWorld":{  
         "local":{  
            "app-local-black":{
             "checkbox_view":true,
             "checkbox_edit":true,
             "checkbox_delete":true
            }

         },
         "global":{  
           "app-global-red":{            
             "checkbox_view":true,
             "checkbox_edit":true,
             "checkbox_delete":true
            }

         },
         "world":{  
            "app-world-green":{
             "checkbox_view":true,
             "checkbox_edit":true,
             "checkbox_delete":true
            }
         }
      }
   },
   {  
      "systemMgmt":{  
            "checkbox_view":true,
             "checkbox_edit":true,
             "checkbox_delete":true
      }
   },
   {  
      "rules":{  
         "Rule1":{  
            "rule2":{
              "rule3":{  
                   "checkbox_view":true,
                   "checkbox_edit":true,
                   "checkbox_delete":true
            }
         }
         }

      }
   }
]

Expacted Output 精确的输出 在此处输入图片说明

You answer valuable for me. 您的回答对我很有价值。 Thanks in advance. 提前致谢。

The simplest way I can think of accomplishing this with vanilla Javascript would be a modified depth first traversal of an object: 我可以想到的使用香草Javascript完成此操作的最简单方法是修改对象的深度优先遍历:

 function renderJSON(json) { const wrapper = document.createElement('div'); const stack = [{ node: json, name: 'root', parentEl: wrapper }]; while (stack.length > 0) { let current = stack.pop(); let currentObj = current.node; let currentParentEl = current.parentEl; let level = document.createElement('div'); level.classList.add('level'); level.textContent = current.name + ': '; if (currentObj.renderContent) { // render custom html content currentObj.renderContent(level); } else if (!(currentObj instanceof Object)) { level.textContent += currentObj; } currentParentEl.append(level); if (currentObj instanceof Object) { let keys = Object.keys(currentObj); if (!currentObj.skipChildren) { // push in reverse to preserve key order for (let i = keys.length - 1; i >= 0; i--) { let key = keys[i]; let node = currentObj[key]; stack.push({ node: node, name: key, parentEl: level }); } } } } return wrapper; } // Example Use Case: const Permissions = function Permissions() { this.skipChildren = true; this.view = false; this.edit = false; this.delete = false; }; Permissions.prototype = { renderContent(el) { const fields = ['view', 'edit', 'delete']; for (let field of fields) { const label = document.createElement('label'); label.textContent = field; const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = this[field]; label.appendChild(checkbox); el.appendChild(label); } } }; const rendered = renderJSON({ element1: { a: 4, b: 6, c: 24, element1a: { a: 'hello' } }, element2: { a: 'abc', permissions: new Permissions() }, element3: ["first", "second", "third"] }); document.body.append(rendered); 
 .level { margin-left: 1em; } 

There's a lot of different ways you could branch off of this code depending on your needs. 您可以根据需要从许多不同的方式分支出此代码。 Since you're given a JSON string to begin with, you'll need to find some way to convert that into a Javascript object that will produce the result you want. 由于开始时提供了一个JSON字符串,因此您需要找到某种方法将其转换为可产生所需结果的Javascript对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM