treeUtils.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // import type { AppRouteRecordRaw } from '/@/router/types';
  2. export interface TreeNode {
  3. id: number;
  4. parentId: number;
  5. name: string;
  6. key?: string;
  7. level?: string;
  8. children?: TreeNode[];
  9. }
  10. export interface TreeMenuNode {
  11. menuId: number;
  12. parentId: number;
  13. name: string;
  14. type?: number;
  15. children?: TreeMenuNode[];
  16. }
  17. // function traverse(tree: TreeMenuNode[], rootId: number) {
  18. // tree.forEach((item) => {
  19. // if (item.parentId == rootId) {
  20. // console.log('name', item.name);
  21. // console.log('menuId', item.menuId);
  22. // console.log('rootId', rootId);
  23. // // temp.push(item.parentId);
  24. // // item.key = temp;
  25. // }
  26. // if (item.children?.length) {
  27. // traverse(item.children, item.menuId);
  28. // }
  29. // });
  30. // }
  31. export function makeTree(treeNodes: TreeNode[]): TreeNode[] {
  32. // 提前生成节点查找表。
  33. // 如果明确节点是顺序可以保证先父后子,可以省去这次遍历,在后面边遍历过程中填充查找表
  34. const nodesMap = new Map<number, TreeNode>(treeNodes.map((node) => [node.id, node]));
  35. // 引入虚拟根节点来统一实现 parent 始终有效,避免空判断
  36. const virtualRoot = {} as Partial<TreeNode>;
  37. treeNodes.forEach((node) => {
  38. const parent = nodesMap.get(node.parentId) ?? virtualRoot;
  39. (parent.children ??= []).push(node);
  40. });
  41. // if (virtualRoot.children?.length) {
  42. // traverse(virtualRoot.children, virtualRoot.children[0].id);
  43. // }
  44. return virtualRoot.children ?? [];
  45. }
  46. export function makeMenuTree(treeNodes: TreeMenuNode[]): TreeMenuNode[] {
  47. const nodesMap = new Map<number, TreeMenuNode>(treeNodes.map((node) => [node.menuId, node]));
  48. // 引入虚拟根节点来统一实现 parent 始终有效,避免空判断
  49. const virtualRoot = {} as Partial<TreeMenuNode>;
  50. treeNodes.forEach((node) => {
  51. const parent = nodesMap.get(node.parentId) ?? virtualRoot;
  52. (parent.children ??= []).push(node);
  53. });
  54. return virtualRoot.children ?? [];
  55. }