Создайте узлы по 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 или явная сортировка. Иерархия при этом совпадает.