utils.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import type { TreeNodeData } from '@element-plus/components/tree/src/tree.type'
  2. export function isValidValue(val: any) {
  3. return val || val === 0
  4. }
  5. export function isValidArray(val: any) {
  6. return Array.isArray(val) && val.length
  7. }
  8. export function toValidArray(val: any) {
  9. return Array.isArray(val) ? val : isValidValue(val) ? [val] : []
  10. }
  11. type TreeCallback<T extends TreeNodeData, R> = (
  12. data: T,
  13. index: number,
  14. array: T[],
  15. parent?: T
  16. ) => R
  17. type TreeFindCallback<T extends TreeNodeData> = TreeCallback<T, boolean>
  18. export function treeFind<T extends TreeNodeData>(
  19. treeData: T[],
  20. findCallback: TreeFindCallback<T>,
  21. getChildren: (data: T) => T[]
  22. ): T | undefined
  23. export function treeFind<T extends TreeNodeData, R>(
  24. treeData: T[],
  25. findCallback: TreeFindCallback<T>,
  26. getChildren: (data: T) => T[],
  27. resultCallback?: TreeCallback<T, R>,
  28. parent?: T
  29. ): R | undefined
  30. export function treeFind<T extends TreeNodeData, R>(
  31. treeData: T[],
  32. findCallback: TreeFindCallback<T>,
  33. getChildren: (data: T) => T[],
  34. resultCallback?: TreeCallback<T, R>,
  35. parent?: T
  36. ): T | R | undefined {
  37. for (let i = 0; i < treeData.length; i++) {
  38. const data = treeData[i]
  39. if (findCallback(data, i, treeData, parent)) {
  40. return resultCallback ? resultCallback(data, i, treeData, parent) : data
  41. } else {
  42. const children = getChildren(data)
  43. if (isValidArray(children)) {
  44. const find = treeFind(
  45. children,
  46. findCallback,
  47. getChildren,
  48. resultCallback,
  49. data
  50. )
  51. if (find) return find
  52. }
  53. }
  54. }
  55. }
  56. export function treeEach<T extends TreeNodeData>(
  57. treeData: T[],
  58. callback: TreeCallback<T, void>,
  59. getChildren: (data: T) => T[],
  60. parent?: T
  61. ) {
  62. for (let i = 0; i < treeData.length; i++) {
  63. const data = treeData[i]
  64. callback(data, i, treeData, parent)
  65. const children = getChildren(data)
  66. if (isValidArray(children)) {
  67. treeEach(children, callback, getChildren, data)
  68. }
  69. }
  70. }