Построить дерево иерархии из плоского списка с родительским полем?
У меня есть список объектов "страницы" с полем parent
. Это родительское поле ссылается на другой объект в списке. Я хотел бы создать иерархию дерева из этого списка на основе этого поля.
Вот как выглядит мой оригинальный список:
[
{
id: 1,
title: 'home',
parent: null
},
{
id: 2,
title: 'about',
parent: null
},
{
id: 3,
title: 'team',
parent: 2
},
{
id: 4,
title: 'company',
parent: 2
}
]
Я хотел бы преобразовать его в древовидную структуру следующим образом:
[
{
id: 1,
title: 'home',
parent: null
},
{
id: 2,
title: 'about',
parent: null,
children: [
{
id: 3,
title: 'team',
parent: 2
},
{
id: 4,
title: 'company',
parent: 2
}
]
]
Я надеялся на функцию повторного использования, которую я могу вызвать против произвольного списка в любое время. Кто-нибудь знает хороший способ справиться с этим? Любая помощь или совет будут очень благодарны!
Ответы
Ответ 1
function treeify(list, idAttr, parentAttr, childrenAttr) {
if (!idAttr) idAttr = 'id';
if (!parentAttr) parentAttr = 'parent';
if (!childrenAttr) childrenAttr = 'children';
var treeList = [];
var lookup = {};
list.forEach(function(obj) {
lookup[obj[idAttr]] = obj;
obj[childrenAttr] = [];
});
list.forEach(function(obj) {
if (obj[parentAttr] != null) {
lookup[obj[parentAttr]][childrenAttr].push(obj);
} else {
treeList.push(obj);
}
});
return treeList;
};
Fiddle