Как рекурсивно преоброзовать массивы категорий в обьект — дерево категорий?

у меня есть товары у каждого из них есть массив категорий с 0 индекса = первый уровень категорий и тд. но длинна массивов n(неизвестна) то есть может быть разный уровень вложенности категорий
Пример:
[
  'Мелкая бытовая техника',
  'Техника для дома',
  'Утюги',
  'Отпариватели' 
],
[ 'Компьютерная и офисная техника',  'Перефирийные устройства' ]
[
  'Компьютерная и офисная техника',
  'Комплектующие для компьютеров',
  'Память',
  'Память оперативная',
  'DDR4 Desktop'
]

Мне нужно получить из этого удобное дерево категорий, необязательно обьект, главное чтобы было общее дерево всех категорий

Я написал примерный код но он по понятным причинам обрабатывает только первые два уровня категорий
const getCategorieTree = function (products) {
  const tree = {}

  for (const product of products) {
    for (const [index, categorie] of product.categories.entries()) {
      if (index === 0) {
        if (!tree[categorie])
          tree[categorie] = new Object()
      } else {
        if (tree[product.categories[index - 1]])
          tree[product.categories[index - 1]][categorie] = new Object()
      }
    }
  }

  return tree
}

а вот что он в итоге создает
{
	"Аудио-видео техника": {
		"Аудио техника": {},
		"Презентационное оборудование": {},
		"Проекционное оборудование": {},
		"Телевизоры": {}
	},
	"Аксессуары": {
		"Автотовары": {},
		"Аксессуары IT": {},
		"Аксессуары АВ/ТВ": {},
		"Аксессуары для видео стен и коммерческих панелей": {},
		"Аксессуары для интерактивных досок": {},
		"Аксессуары для проекторов": {},
		"Аксессуары для пылесосов": {},
		"Аксессуары МБТ": {},
		"Аксессуары персональной электроники": {},
		"Аксессуары разное": {},
		"Кабельное оборудование": {},
		"Носители информации": {},
		"Элементы питания": {}
	},
	"Активный отдых,туризм": {
		"Оптическое оборудование": {},
		"Фонари и аксессуары": {},
		"Фото-видео камеры": {}
	},
	"Дом, сад, ремонт": {
		"Ловушки отпугиватели": {},
		"Умный дом": {},
		"Электроинструмент": {}
	},
	"Компьютерная и офисная техника": {
		"Игровая зона": {},
		"Комплектующие для компьютеров": {},
		"Офисное оборудование": {},
		"Перефирийные устройства": {},
		"Печатающие/сканирующие устройства": {},
		"Планшетный компьютер/Электронная книга": {},
		"Расходные Материалы для печатающих устройств": {}
	},
	"Мелкая бытовая техника": {
		"Завтрак": {},
		"Здоровое питание": {},
		"Климатическая тех-ка ВСЕСЕЗОН": {},
		"Климатическая тех-ка ЗИМА": {},
		"Красота и здоровье": {},
		"МБТ для кухни": {},
		"Мир кофе": {},
		"Техника для дома": {},
		"Товары для детей": {}
	},
	"Персональная электроника и телефония": {
		"Офисные принадлежности": {},
		"Телефония": {}
	}
}

я предполагаю что это можно сделать рекурсивным методом но пока не получается
прошу помощи
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
hahenty
@hahenty
('•')
function mktree( sub, list ) {
  if( list.length === 0 ) return;
  const subsub = sub[ list[ 0 ] ] = sub[ list[ 0 ] ] || {};
  mktree( subsub, list.slice(1) )
}

[[
  'Мелкая бытовая техника',
  'Техника для дома',
  'Утюги',
  'Отпариватели' 
],
[ 'Компьютерная и офисная техника',  'Перефирийные устройства' ],
[
  'Компьютерная и офисная техника',
  'Комплектующие для компьютеров',
  'Память',
  'Память оперативная',
  'DDR4 Desktop'
]].reduce( (tree, list) => ( mktree(tree,list),tree ), {} )
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы