代码之家  ›  专栏  ›  技术社区  ›  Varun Sharma

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

  •  0
  • Varun Sharma  · 技术社区  · 6 年前

    我正在实现多级数据表而不使用任何插件或库。我想基于javaScript、JQuery或angular js实现。我查了下面的链接,

    Traverse all the Nodes of a JSON Object Tree with JavaScript

    nested table using ng-repeat

    但我的json结构与上面的链接不同。

    我需要在树状结构UI中显示我的JSON。我不硬编码在html级别。所有级别都应该由javascript处理。

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

    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
                }
             }
             }
    
          }
       }
    ]
    

    表达式输出 enter image description here

    你的回答对我很有价值。提前谢谢。

    0 回复  |  直到 6 年前
        1
  •  0
  •   stuck    5 年前

    我认为用普通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;
    }

    根据您的需要,有很多不同的方法可以将这些代码分支出来。因为首先给了您一个JSON字符串,所以您需要找到一些方法将其转换为Javascript对象,从而生成所需的结果。