Как построить html дерево по массиву объектов с дочерними элементами?

Есть массив данных
const data = [
    {
        name: 'Folder 1'
    },
    {
        name: 'Folder 2',
        children: [
            {
                name: 'Folder 3',
                children: [
                    {
                        name: 'Folder 4'
                    }
                ]
            }
        ]
    }
]


А также html структура, как они должны выводиться для пользователя. На выходе нужно получить дерево из элементов массива, где все дочерние элементы будут визуально вложены использую существующую разметку

<ul id="root">
        <li>
            <div>Folder 1</div>
        </li>
        <li>
            <div>Folder 2</div>
            <ul>
                <li>
                    <div>Folder 3</div>
                </li>
            </ul>
        </li>
    </ul>


На данный момент пока получилось вывести только элементы первого уровня, но не могу понять, как заставить выводиться дочерние элементы со своей разметкой
  • Вопрос задан
  • 319 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
получилось вывести только элементы первого уровня, но не могу понять, как заставить выводиться дочерние элементы

Рекурсия. Если в элементе есть непустой массив children, то делаете рекурсивный вызов функции, передавая ей этот массив.

Можно самостоятельно создавать элементы:

const createNestedList = data =>
  data.reduce((ul, { name, children }) => {
    const li = document.createElement('li');
    const div = document.createElement('div');

    div.textContent = name;
    li.appendChild(div);

    if (children instanceof Array && children.length) {
      li.appendChild(createNestedList(children));
    }

    ul.appendChild(li);

    return ul;
  }, document.createElement('ul'));


document.body.appendChild(createNestedList(data));

Или собрать соответствующую разметку:

const createNestedList = data => `
  <ul>${data.map(n => `
    <li>
      <div>${n.name}</div>
      ${Array.isArray(n.children) && n.children.length ? createNestedList(n.children) : ''}
    </li>`).join('')}
  </ul>`;


document.body.insertAdjacentHTML('beforeend', createNestedList(data));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
15 мая 2024, в 22:07
3000 руб./за проект
15 мая 2024, в 22:06
3000 руб./за проект
15 мая 2024, в 20:48
5000 руб./за проект