tav-ui
Version:
1 lines • 14.9 kB
Source Map (JSON)
{"version":3,"file":"treeHelper2.mjs","sources":["../../../../../../packages/utils/helper/treeHelper.ts"],"sourcesContent":["interface TreeHelperConfig {\n id: string\n children: string\n pid: string\n}\n\ndeclare interface Fn<T = any, R = T> {\n (...arg: T[]): R\n}\n\nconst DEFAULT_CONFIG: TreeHelperConfig = {\n id: 'id',\n children: 'children',\n pid: 'pid',\n}\n\nconst getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config)\n\n// tree from list\nexport function listToTree<T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] {\n const conf = getConfig(config) as TreeHelperConfig\n const nodeMap = new Map()\n const result: T[] = []\n const { id, children, pid } = conf\n\n for (const node of list) {\n node[children] = node[children] || []\n nodeMap.set(node[id], node)\n }\n for (const node of list) {\n const parent = nodeMap.get(node[pid])\n ;(parent ? parent.children : result).push(node)\n }\n return result\n}\n\nexport function treeToList<T = any>(\n tree: any,\n config: Partial<TreeHelperConfig> = {},\n clearParentChildren = false\n): T {\n config = getConfig(config)\n const { children } = config\n const result: any = [...tree]\n for (let i = 0; i < result.length; i++) {\n if (!result[i][children!]) continue\n result.splice(i + 1, 0, ...result[i][children!])\n if (clearParentChildren) result[i][children!] = []\n }\n return result\n}\n\nexport function findNode<T = any>(\n tree: any,\n func: Fn,\n config: Partial<TreeHelperConfig> = {}\n): T | null {\n config = getConfig(config)\n const { children } = config\n const list = [...tree]\n for (const node of list) {\n if (func(node)) return node\n node[children!] && list.push(...node[children!])\n }\n return null\n}\n\nexport function findNodeAll<T = any>(\n tree: any,\n func: Fn,\n config: Partial<TreeHelperConfig> = {}\n): T[] {\n config = getConfig(config)\n const { children } = config\n const list = [...tree]\n const result: T[] = []\n for (const node of list) {\n func(node) && result.push(node)\n node[children!] && list.push(...node[children!])\n }\n return result\n}\n\nexport function findPath<T = any>(\n tree: any,\n func: Fn,\n config: Partial<TreeHelperConfig> = {}\n): T | T[] | null {\n config = getConfig(config)\n const path: T[] = []\n const list = [...tree]\n const visitedSet = new Set()\n const { children } = config\n while (list.length) {\n const node = list[0]\n if (visitedSet.has(node)) {\n path.pop()\n list.shift()\n } else {\n visitedSet.add(node)\n node[children!] && list.unshift(...node[children!])\n path.push(node)\n if (func(node)) return path\n }\n }\n return null\n}\n\nexport function findPathAll(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}) {\n config = getConfig(config)\n const path: any[] = []\n const list = [...tree]\n const result: any[] = []\n const visitedSet = new Set()\n const { children } = config\n while (list.length) {\n const node = list[0]\n if (visitedSet.has(node)) {\n path.pop()\n list.shift()\n } else {\n visitedSet.add(node)\n node[children!] && list.unshift(...node[children!])\n path.push(node)\n func(node) && result.push([...path])\n }\n }\n return result\n}\n\nexport function filter<T = any>(\n tree: T[],\n func: (n: T) => boolean | string,\n config: Partial<TreeHelperConfig> = {}\n): T[] {\n config = getConfig(config)\n const children = config.children as string\n function listFilter(list: T[]) {\n return list\n .map((node: any) => ({ ...node }))\n .filter((node) => {\n node[children] = node[children] && listFilter(node[children])\n return func(node) || (node[children] && node[children].length)\n })\n }\n return listFilter(tree)\n}\n\nexport function forEach<T = any>(\n tree: T[],\n func: (n: T) => any,\n config: Partial<TreeHelperConfig> = {}\n): void {\n config = getConfig(config)\n const list: any[] = [...tree]\n const { children } = config\n for (let i = 0; i < list.length; i++) {\n // func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿\n if (func(list[i])) return\n\n children && list[i][children] && list.splice(i + 1, 0, ...list[i][children])\n }\n}\n\n/**\n * @description: Extract tree specified structure\n */\nexport function treeMap<T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] {\n return treeData.map((item) => treeMapEach(item, opt))\n}\n\n/**\n * @description: Extract tree specified structure\n */\nexport function treeMapEach(\n data: any,\n { children = 'children', conversion }: { children?: string; conversion: Fn }\n) {\n const haveChildren = Array.isArray(data[children]) && data[children].length > 0\n const conversionData = conversion(data) || {}\n if (haveChildren) {\n return {\n ...conversionData,\n [children]: data[children].map((i: number) =>\n treeMapEach(i, {\n children,\n conversion,\n })\n ),\n }\n } else {\n return {\n ...conversionData,\n }\n }\n}\n\nexport function findChildrens<T = any>(\n tree: T[],\n childrenId: string | number,\n func: (n: T) => boolean | string,\n config: Partial<TreeHelperConfig> = {}\n): T[] {\n config = getConfig(config)\n const childrens: any[] = []\n const list: any[] = [...tree]\n const { children, id, pid } = config\n\n function traverse(_list: T[], _childrenId: string | number, _parentId?: string | number) {\n for (let i = 0; i < _list.length; i++) {\n const item = _list[i] as any\n if (item[id!] === _childrenId || item[pid!] === _parentId) {\n childrens.push(func(item) ?? item)\n if (item[children!] && item[children!].length) {\n traverse(item[children!], _childrenId, item[id!])\n }\n } else {\n if (item[children!] && item[children!].length) {\n traverse(item[children!], _childrenId)\n }\n }\n }\n }\n\n traverse(list, childrenId)\n return childrens\n}\n\nexport function findParents<T = any>(\n tree: T[],\n parentId: string | number,\n func: (n: T) => boolean | string,\n config: Partial<TreeHelperConfig> = {}\n): T[] {\n config = getConfig(config)\n const parents: any[] = []\n const list: any[] = [...tree]\n const { children, pid, id } = config\n\n function traverse(_list: T[], _parentId: string | number) {\n // 遍历树\n for (let i = 0; i < _list.length; i++) {\n const item = _list[i] as any\n if (item[id!] === _parentId) {\n parents.push(func(item) ?? item)\n traverse(list, item[pid!])\n break\n } else {\n if (item[children!] && item[children!].length) {\n traverse(item[children!], _parentId)\n }\n }\n }\n }\n\n traverse(list, parentId)\n return parents\n}\n"],"names":[],"mappings":"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"}