Итак, я пытаюсь написать рекурсивную функцию, которая принимает плоский массив объектов с их значением, идентификатором и идентификатором их родительского узла и преобразует его в древовидную структуру, где дочерние элементы структуры являются массивом.узлов.Дочерние элементы должны быть отсортированы по идентификатору, и если его null
, то это может быть корневой узел.
Функция, которая пытается написать функцию toTree (data), должна принимать только массив данных.Я был не в состоянии сделать это без родителей.Пока что у меня есть функция (ниже), которая берет данные и родительский элемент для запуска.
input:
const tasks = [
{ id: 1, parent: null, value: 'Make breakfast' },
{ id: 2, parent: 1, value: 'Brew coffee' },
{ id: 3, parent: 2, value: 'Boil water' },
{ id: 4, parent: 2, value: 'Grind coffee beans' },
{ id: 5, parent: 2, value: 'Pour water over coffee grounds' }
];
output:
{
id: 1,
parent: null,
value: 'Make Breakfast',
children: [
{
id: 2,
parent: 1,
value: 'Brew coffee',
children: [
{ id: 3, parent: 2, value: 'Boil water' },
{ id: 4, parent: 2, value: 'Grind coffee beans' },
{ id: 5, parent: 2, value: 'Pour water over coffee grounds' }
]
}
]
}
funciton toTree(data) {
customtoTree (data, null);
}
function customToTree (data, parent) {
const out = [];
data.forEach((obj) => {
if (obj.parent === parent) {
const children = customToTree(data,obj.parent);
if (children.length) {
obj[children[0]] = children;
}
const {id,parent, ...content} = obj;
out.push(content);
}
});
return out;
}
Я быМне действительно нравится понимать правильную логику о том, как это сделать, и думать об этом, и как это сделать, не предоставляя явно родителя.