treeUtils.ts 1.9 KB

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