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

Posted

技术标签:

【中文标题】如何在javascript中实现分层多级数据表?【英文标题】:How to implement hierarchical multilevel datatable in javaScript? 【发布时间】:2019-02-01 23:40:40 【问题描述】:

我在不使用任何插件或库的情况下实现多级数据表。我想基于 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
            
         
         

      
   
]

预期输出

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

【问题讨论】:

您的问题不是很清楚,您需要在 Tree Structure UI 中显示您的 JSON 吗? @HyyanAboFakher 感谢您的评论。是的,我必须在 UI 中的树结构中显示我的 json。 那么也许你可以试试this component @HyyanAboFakher 感谢您的良好沟通。我不想使用任何外部大库。 this 之类的内容可能会有所帮助。 【参考方案1】:

我能想到的使用 vanilla 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 对象,从而产生您想要的结果。

【讨论】:

以上是关于如何在javascript中实现分层多级数据表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rust 中实现多级柯里化函数?

如何在 Bootstrap v4.1 中实现多级下拉菜单? [复制]

如何在 HBase 中实现分层存储?

实体框架映射多级属性

如何在 Keras 中实现分层 Transformer 用于文档分类?

在 Spring Security 中实现分层角色