treeUtils.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. id: number;
  16. children?: TreeMenuNode[];
  17. }
  18. // function traverse(tree: TreeMenuNode[], rootId: number) {
  19. // tree.forEach((item) => {
  20. // if (item.parentId == rootId) {
  21. // console.log('name', item.name);
  22. // console.log('menuId', item.menuId);
  23. // console.log('rootId', rootId);
  24. // // temp.push(item.parentId);
  25. // // item.key = temp;
  26. // }
  27. // if (item.children?.length) {
  28. // traverse(item.children, item.menuId);
  29. // }
  30. // });
  31. // }
  32. export function makeTree(treeNodes: TreeNode[]): TreeNode[] {
  33. // 提前生成节点查找表。
  34. // 如果明确节点是顺序可以保证先父后子,可以省去这次遍历,在后面边遍历过程中填充查找表
  35. const nodesMap = new Map<number, TreeNode>(treeNodes.map((node) => [node.id, node]));
  36. // 引入虚拟根节点来统一实现 parent 始终有效,避免空判断
  37. const virtualRoot = {} as Partial<TreeNode>;
  38. treeNodes.forEach((node) => {
  39. const parent = nodesMap.get(node.parentId) ?? virtualRoot;
  40. (parent.children ??= []).push(node);
  41. });
  42. // if (virtualRoot.children?.length) {
  43. // traverse(virtualRoot.children, virtualRoot.children[0].id);
  44. // }
  45. return virtualRoot.children ?? [];
  46. }
  47. export function getTreeId(treeNodes: TreeMenuNode[]): number[] {
  48. // 提前生成节点查找表。
  49. // 如果明确节点是顺序可以保证先父后子,可以省去这次遍历,在后面边遍历过程中填充查找表
  50. // const nodesMap = new Map<number, TreeNode>(treeNodes.map((node) => [node.id, node]));
  51. // 引入虚拟根节点来统一实现 parent 始终有效,避免空判断
  52. let TreeIdList:number[] = []
  53. function getTreeIdList(list:TreeMenuNode[]) {
  54. return list.map(ele => {
  55. if(ele.children && ele.children.length){
  56. getTreeIdList(ele.children)
  57. }else{
  58. TreeIdList.push(ele.id)
  59. }
  60. })
  61. }
  62. getTreeIdList(treeNodes)
  63. console.log('TreeIdList',TreeIdList,treeNodes)
  64. return TreeIdList ?? [];
  65. }
  66. export function makeMenuTree(treeNodes: TreeMenuNode[]): TreeMenuNode[] {
  67. const nodesMap = new Map<number, TreeMenuNode>(treeNodes.map((node) => [node.menuId, node]));
  68. // 引入虚拟根节点来统一实现 parent 始终有效,避免空判断
  69. const virtualRoot = {} as Partial<TreeMenuNode>;
  70. treeNodes.forEach((node) => {
  71. const parent = nodesMap.get(node.parentId) ?? virtualRoot;
  72. (parent.children ??= []).push(node);
  73. });
  74. return virtualRoot.children ?? [];
  75. }