Построение иерархии категорий из плоского массива

Создайте узлы по title, затем добавьте каждого ребёнка к указанному parent. Поле children добавляйте только при наличии потомков.

Короткий ответ

Что ответить на собеседовании

Создайте узлы по title, затем добавьте каждого ребёнка к указанному parent. Поле children добавляйте только при наличии потомков.

Подробный разбор

Ответ с пояснениями

Условие

Дан массив объектов‑категорий, где каждое имеет поле title – название категории, и поле parent – название её родительской категории. Значение null в parent указывает на корневой уровень. Необходимо реализовать функцию createCategoryTree, принимающую такой массив и возвращающую структуру дерева: каждый узел содержит title, а при наличии дочерних элементов — массив children с аналогичными объектами. В комментариях к коду приведён пример входных данных и ожидаемого результата.

const sourceCategories = [
  {
    "title": "Приготовление напитков",
    "parent": "Техника для кухни"
  },
  {
    "title": "Техника для дома",
    "parent": "Бытовая техника"
  },
  {
    "title": "Варочные панели",
    "parent": "Встраиваемая техника"
  },
  {
    "title": "Бытовая техника",
    "parent": null
  },
  {
    "title": "Встраиваемая техника",
    "parent": "Бытовая техника"
  },
  {
    "title": "Духовые шкафы",
    "parent": "Встраиваемая техника"
  },
  {
    "title": "Продукты питания",
    "parent": null
  },
  {
    "title": "Электрочайники и термопоты",
    "parent": "Техника для кухни"
  },
  {
    "title": "Вытяжки",
    "parent": "Встраиваемая техника"
  },
  {
    "title": "Техника для кухни",
    "parent": "Бытовая техника"
  }
];

function createCategoryTree(flatList) {
  return
}

console.log(createCategoryTree(sourceCategories))

/*
[
  {
    title: "Бытовая техника",
    children: [
      {
        title: "Встраиваемая техника",
        children: [
          { title: "Варочные панели" },
          { title: "Духовые шкафы" },
          { title: "Вытяжки" }
        ]
      },
      {
        title: "Техника для кухни",
        children: [
          { title: "Электрочайники и термопоты" },
          { title: "Приготовление напитков" }
        ]
      },
      {
        title: "Техника для дома"
      }
    ]
  },
  {
    title: "Продукты питания",
  }
]
*/

Ответ

Создайте узлы по title, затем добавьте каждого ребёнка к указанному parent. Поле children добавляйте только при наличии потомков.

function createCategoryTree(flatList) {
  const nodes = new Map();
  for (const item of flatList) {
    if (nodes.has(item.title)) throw new Error('Повтор title');
    nodes.set(item.title, { title: item.title });
  }
  const roots = [];
  for (const item of flatList) {
    const node = nodes.get(item.title);
    if (item.parent === null) roots.push(node);
    else {
      const parent = nodes.get(item.parent);
      if (!parent) throw new Error('Родитель не найден');
      (parent.children ??= []).push(node);
    }
  }
  const stack = [...roots], seen = new Set();
  while (stack.length) {
    const node = stack.pop();
    if (seen.has(node)) throw new Error('Цикл');
    seen.add(node);
    for (const child of node.children ?? []) stack.push(child);
  }
  if (seen.size !== nodes.size) throw new Error('Цикл');
  return roots;
}

Порядок соседей соответствует входному массиву. В ожидаемом примере он отличается без объяснённого правила: для точного повторения порядка нужен order или явная сортировка. Иерархия при этом совпадает.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее