{"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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"}