генерировать элементы div на основе строковых путей - PullRequest
0 голосов
/ 04 июня 2018

Я работаю над расширением Chrome и мне нужно создавать вложенные DOM-элементы на основе категорий.Эти категории сохраняются в виде строк в массиве.Уровень иерархии подкатегорий показан через пути.

Вот простой пример

массив категорий:

let categories = [a, a/b, b, b/c/d];

Я хочу сгенерировать вложенные элементы div, подобные этому:

<div id="a">
    <div id="b"></div>
</div>
<div id="b">
    <div id="c">
        <div id="d"></div>            
    </div>
</div>

С моим текущим статусом я создаю только уникальные div верхнего уровня и не знаю, как генерировать уникальные подкатегории в div верхнего уровня.

categories.forEach(function (i) {

  let splitedCategory = i.split('/');

  let parentID = String(splitedCategory[0]);
  let parentElement = document.getElementById(parentID);

  if(!containerElement.contains(parentElement)) {
    containerElement.innerHTML += '<div id="' + i + '"></div>';
  }
});

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Сначала вам нужно отформатировать ваш массив как объект с уровнями, а затем рекурсивно создать элементы DOM.Вот полный пример:

<html>
    <head>
        <meta charset="UTF-8" />
    </head>
    <body>
        <div id="result"></div>
        <script type="text/javascript">
        /**
         * Build HTML tree recursively from object.
         *
         * @param  Object  obj
         * @param  Element context
         * @param  String  prefix
         * @return void
         */

        function buildTree(obj, context, prefix){
            for(var key in obj){
                let div = document.createElement('div'),
                    pID = prefix ? prefix+'_'+key : key;

                div.setAttribute('id', pID);
                div.classList.add(key);
                buildTree(obj[key], div, pID);
                context.appendChild(div);
            }
        }

        /**
         * Format array as tree.
         *
         * @param  Array  arr
         * @param  String separator
         * @return Object
         */

        function arrayToTree(arr, separator){
            let formatted = {};

            if(!separator){
                separator = '/';
            }

            for(let i=0; i<arr.length; i++){
                let category = arr[i],
                    parts    = category.split(separator),
                    current  = formatted;

                for(let e=0; e<parts.length; e++){
                    let lvl = parts[e];

                    if(!current[lvl]){
                        current[lvl] = {};
                    }

                    current = current[lvl];
                }
            }

            return formatted;
        }

        var pathsTree = arrayToTree(['a', 'a/b', 'b', 'b/c/d']),
            resultDiv = document.getElementById('result');

        buildTree(pathsTree, resultDiv);
        </script>
    </body>
</html>
0 голосов
/ 04 июня 2018

let categories = ['a', 'a/b', 'b', 'b/c/d'];

function f(str, html = ''){
  str = str.split('/');
  html += `<div id="${str[0]}">`
  if(str.length > 1){
    html += f(str.slice(1).join("/"));
  }
  html += `</div>`;
  return html;
}

categories.map(a=>console.log(f(a, '')))
...