Как пересобрать одномерный массив категорий, подкатегорий и под подкатегорий в массив с вложенными категориями?

Для пересборки одномерного массива категорий, подкатегорий и под подкатегорий в массив с вложенными категориями в 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": []
      }
    ]
  }
]

Теперь у нас есть массив с вложенными категориями, подкатегориями и под подкатегориями, который можно использовать в дальнейшей работе программы.