Для пересборки одномерного массива категорий, подкатегорий и под подкатегорий в массив с вложенными категориями в JavaScript можно использовать рекурсивный подход.
Предположим, у нас есть одномерный массив, представляющий категории, подкатегории и под подкатегории в следующем формате:
let categories = [ { id: 1, name: 'Фрукты', parent: null }, { id: 2, name: 'Яблоки', parent: 1 }, { id: 3, name: 'Груши', parent: 1 }, { id: 4, name: 'Зелень', parent: null }, { id: 5, name: 'Петрушка', parent: 4 }, { id: 6, name: 'Укроп', parent: 4 }, { id: 7, name: 'Мясо', parent: null }, { id: 8, name: 'Курица', parent: 7 }, { id: 9, name: 'Говядина', parent: 7 } ];
Для начала, мы можем создать объект-словарь, в котором ключом будет id
категории, а значением – сама категория:
let categoryDictionary = {}; categories.forEach(category => { categoryDictionary[category.id] = category; });
Затем мы можем создать новый массив и использовать рекурсивную функцию для перебора категорий и их дочерних элементов:
function buildCategoryTree(category) { let categoryTree = {}; categoryTree.id = category.id; categoryTree.name = category.name; categoryTree.children = []; categories.forEach(childCategory => { if (childCategory.parent === category.id) { let childNode = buildCategoryTree(childCategory); categoryTree.children.push(childNode); } }); return categoryTree; } let categoryTree = []; categories.forEach(category => { if (category.parent === null) { let categoryNode = buildCategoryTree(category); categoryTree.push(categoryNode); } });
categoryTree
будет содержать массив с вложенными категориями, подкатегориями и под подкатегориями:
[ { "id": 1, "name": "Фрукты", "children": [ { "id": 2, "name": "Яблоки", "children": [] }, { "id": 3, "name": "Груши", "children": [] } ] }, { "id": 4, "name": "Зелень", "children": [ { "id": 5, "name": "Петрушка", "children": [] }, { "id": 6, "name": "Укроп", "children": [] } ] }, { "id": 7, "name": "Мясо", "children": [ { "id": 8, "name": "Курица", "children": [] }, { "id": 9, "name": "Говядина", "children": [] } ] } ]
Теперь у нас есть массив с вложенными категориями, подкатегориями и под подкатегориями, который можно использовать в дальнейшей работе программы.