Многоуровнёвое меню в массиве

275
13 июля 2017, 02:35

Нужно сделать трёхуровнёвое меню для интернет-магазина, которое будет открываться по клику.

  1. Как сделать многомерный массив, в котором будут только названия этих пунктов 3х уровневого меню? А в html, допустим с помощью шаблонизатора ejs брать данные из этого многомерного массива, и формировать меню.т.е. интересует именно создание этого массива, в котором будут названия меню, расположенные по уровню вложенности.
  2. Как правильно создать это меню, чтобы потом можно было в цикле создавать многомерное меню из этого массива?
  3. Приведите пожалуйста простой пример массива с многоуровнёвым меню.

Я так понимаю тут нужно использовать объект, в котором ключ будет как отдельное меню? Что-то на подобии такого нужно сделать

<%
    let catalog = [
        {
            id: 1,
            title: 'Наборы для творчества',
            parent: 0
        },
        {
            id: 2,
            title: 'Научные игры',
            parent: 0
        },
        {
            id: 3,
            title: 'Настольные игры',
            parent: 0
        },
        {
            id: 4,
            title: 'Демонстрационные материалы',
            parent: 0
        },
        {
            id: 5,
            title: 'Раздаточные материалы',
            parent: 0
        },
        {
            id: 6,
            title: 'Рабочие тетради',
            parent: 0
        },
        {
            id: 7,
            title: 'Плакаты и таблицы',
            parent: 0
        },
        {
            id: 8,
            title: 'Оформление интерьера детского сада',
            parent: 0
        },
        {
            id: 9,
            title: 'Портфели, портфолио, детские анкеты',
            parent: 0
        },
        {
            id: 10,
            title: 'Для детской комнаты',
            parent: 0
        },
        {
            id: 11,
            title: 'Канцтовары',
            parent: 0
        },
        {
            id: 12,
            title: 'Новогодние товары',
            parent: 0
        },
        {
            id: 13,
            title: 'Большие наборы для творчества',
            parent: 1
        },
        {
            id: 14,
            title: 'Наборы для творчества из гипса',
            parent: 1
        },
        {
            id: 15,
            title: 'Картинки из песка, блесток, пайеток',
            parent: 1
        },
        {
            id: 16,
            title: 'HANDMADE - декор своими руками',
            parent: 1
        },
        {
            id: 17,
            title: 'Наборы для творчества на любой вкус',
            parent: 1
        },
        {
            id: 18,
            title: 'Наборы для слепков',
            parent: 1
        },
        {
            id: 19,
            title: 'Гравюры',
            parent: 1
        },
        {
            id: 20,
            title: 'Роспись по холсту',
            parent: 1
        },
        {
            id: 21,
            title: 'Раскраски и наклейки',
            parent: 1
        },
        {
            id: 22,
            title: 'Раскраски',
            parent: 13
        },
        {
            id: 23,
            title: 'Альбомы с наклейками',
            parent: 13
        },
        {
            id: 24,
            title: 'Наборы наклеек',
            parent: 13
        }
    ]
    for(let i = 0; i < catalog.length; i++){ %>
        <% if(catalog[i]['parent'] == 0) { %>
        <li><%- catalog[i]['title'] %></li>
        <% } else {%>
        <ul>
            <li><%- catalog[i]['title'] %></li>
        </ul>
    <% }}
 %>
Answer 1

Вовсе не обязательно хранить его в многоуровневом массиве. Достаточно одноуровневого,и выводить с указанием некоего (условно) parent_id. Неограниченная вложенность гарантирована :) а многомерный массив это тонны forEach, вложенных друг в друга, или рекурсия, или ещё много чего страшного. ИМХО

Например (псевдокод):

array = [
    [0] = [
        'title' = 'Телефоны',
        'parent_id' = NULL
    ],
    [1] = [
        'title' = 'ASUS',
        'parent_id' = 0
    ],
    [2] = [
        'title' = 'Автомобили',
        'parent_id' = NULL
    ],
    [3] = [
        'title' = 'Nissan',
        'parent_id' = 2
    ],
    [4] = [
        'title' = 'Samsung',
        'parent_id' = 0
    ],
    [5] = [
        'title' = 'Infiniti',
        'parent_id' = 2
    ],
    [6] = [
        'title' = 'Galaxy Note 3',
        'parent_id' = 4
    ]
]

Вот смотрите. У нас две корневых категории - это Телефоны и Автомобили, у них parent_id либо равен NULL, либо можно вообще не задавать, типа они никуда не вложены, корневые. Дальше у нас ASUS и Samsung вложены в parent_id=0, то есть в Телефоны. parent_id совпадает с индексом элемента, в который он вложен. Nissan и Infiniti вложены в Автомобили, parent_id=2. Это второй уровень. И третий уровень вложенности - Galaxy Note 3, он вложен в категорию Samsung, которая вложена в корневую категорию Телефоны.

READ ALSO
Воспроизведение HTML5 видео на Android

Воспроизведение HTML5 видео на Android

На Chrome для Android не воспроизводится автоматическиПодскажите, пожалуйста, как исправить?

271
JavaScript для формы

JavaScript для формы

Есть форма:

181
Обновление переменной из сокета

Обновление переменной из сокета

Есть код который складывает данные из массивов

171