我有一个带有parent字段的“页面”对象列表。此父字段引用列表中的另一个对象。我想基于此字段从此列表创建树层次结构。
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 } ] ]
我希望可以在任何时候针对任意列表调用的可重用函数。有人知道解决这个问题的好方法吗?任何帮助或建议,将不胜感激!
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; };
小提琴