Как реализовать иерархические многоуровневые данные в javaScript? - PullRequest
0 голосов
/ 27 августа 2018

Я реализую многоуровневые данные без использования какого-либо плагина или библиотеки. Я хочу реализовать на основе javaScript, JQuery или угловой JS. Я проверил одну ссылку ниже,

Обход всех узлов дерева объектов JSON с помощью JavaScript

вложенная таблица с использованием ng-repeat

Но моя структура json отличается от указанной выше ссылки.

Мне нужно отобразить мой 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

Вы отвечаете ценным для меня. Заранее спасибо.

1 Ответ

0 голосов
/ 23 июля 2019

Самым простым способом, которым я могу придумать, чтобы выполнить это с помощью ванильного 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, который даст желаемый результат.

...