{"version":3,"sources":["../src/tree/forEachTreeByDfsRecursion.ts"],"names":["forEachTreeByDfsRecursion","treeData","callback","options","startId","childrenKey","idKey","path","DefaultTreeOptions","isStart","isAbort","generatePath","buildPathGenerator","forEachNode","node","level","parent","parentPath","index","curPath","result","ABORT","children","i"],"mappings":";;;;AAsBQ,SAASA,EAAgEC,CAAyBC,CAAAA,CAAAA,CAAsCC,EAA8B,CAC1K,GAAI,CAAE,OAAAC,CAAAA,CAAAA,CAAS,WAAAC,CAAAA,CAAAA,CAAa,MAAAC,CAAM,CAAA,IAAA,CAAAC,CAAI,CAAI,CAAA,MAAA,CAAO,OAC7C,CAAE,OAAA,CAAS,IAAK,CAAA,CAAGC,EAAoBL,CAAW,EAAA,EAAE,CAEpDM,CAAAA,CAAAA,CAAUL,GAAW,IAAO,CAAA,IAAA,CAAQ,OAAQH,CAAa,EAAA,QAAA,CAAW,OAAQA,CAAkBK,CAAAA,CAAK,CAAC,CAAM,GAAA,MAAA,CAAOF,CAAO,CAAI,CAAA,KAAA,CAC5HM,CAAU,CAAA,KAAA,CAERC,EAAeC,GAAmBL,CAAAA,CAAAA,CAAKD,CAAK,CAElD,CAAA,SAASO,EAAYC,CAAYC,CAAAA,CAAAA,CAAQ,CAAGC,CAAAA,CAAAA,CAAqBC,EAAmBC,CAAoC,CAAA,CACpH,IAAMC,CAAU,CAAA,CAAC,GAAGF,CAAWN,CAAAA,CAAAA,CAAaG,CAAI,CAAC,EACjD,GAAIJ,CAAAA,CAAS,OACb,IAAIU,CAAAA,CAAc,KAKlB,GAJIX,CAAAA,GAAY,OAASL,CAAW,EAAA,IAAA,GAChCK,EAAU,MAAOK,CAAAA,CAAAA,CAAKR,CAAK,CAAC,CAAA,GAAM,OAAOF,CAAO,CAAA,CAAA,CAGhDK,CAEAW,GAAAA,CAAAA,CAASlB,EAAS,CAAE,IAAA,CAAAY,EAAM,KAAAC,CAAAA,CAAAA,CAAO,OAAAC,CAAQ,CAAA,IAAA,CAAKG,CAAS,CAAA,KAAA,CAAAD,CAAM,CAAC,CAAA,CAC1DE,IAAWC,GAAO,CAAA,CAAA,CAClBX,EAAU,IACV,CAAA,MACJ,CAEJ,IAAIY,EAAWR,CAAKT,CAAAA,CAAW,EAC/B,GAAIiB,CAAAA,EAAY,MAAM,OAAQA,CAAAA,CAAQ,GAAKA,CAAS,CAAA,MAAA,CAAS,EAAG,CAC5DP,CAAAA,EAAS,EACT,IAASQ,IAAAA,CAAAA,CAAI,EAAGA,CAAID,CAAAA,CAAAA,CAAS,MAAQC,CAAAA,CAAAA,EAAAA,CAEjC,GADAH,CAASP,CAAAA,CAAAA,CAAYS,EAASC,CAAC,CAAA,CAAGR,EAAOD,CAAMK,CAAAA,CAAAA,CAASI,CAAC,CACrDH,CAAAA,CAAAA,GAAWC,IAAO,OAAO,MAErC,CACJ,CACI,KAAA,CAAM,QAAQpB,CAAQ,CAAA,CACtBA,CAAS,CAAA,OAAA,CAAQ,CAACa,CAAMI,CAAAA,CAAAA,GAAUL,EAAYC,CAAM,CAAA,CAAA,CAAG,KAAM,EAAC,CAAGI,CAAK,CAAC,CAAA,CAEvEL,EAAYZ,CAAU,CAAA,CAAA,CAAG,KAAM,EAAC,CAAG,EAAE,EAE7C","file":"chunk-27SK6VNE.mjs","sourcesContent":["import { ABORT } from \"../object/forEachObject\"\nimport { DefaultTreeOptions } from \"./consts\"\nimport { TreeNode, TreeNodeBase } from \"./types\" \nimport { ForEachTreeOptions, IForEachTreeCallback } from \"./forEachTree\";\nimport { buildPathGenerator } from \"./utils\";\n\n/**\n * 深度优先遍历\n * \n * 采用递归算法\n * \n * 对树节点依次进行遍历，并分别将节点数据传递给callback函数\n * \n * 当callback返回ABORT时中止遍历\n * \n * @param treeData\n * @param callback    \n * @param startId  从指定的id的节点开始进行遍历，之前的节点会跳过不会执行callback\n * @param idKey 树节点id字段名称\n * @param childrenName  子节点集合的属性名称，一般是children\n * @idName 节点id的名称，默认为是id\n */\n export function forEachTreeByDfsRecursion<Node extends TreeNodeBase = TreeNode>(treeData: Node[] | Node, callback: IForEachTreeCallback<Node>, options?: ForEachTreeOptions) {\n    let { startId, childrenKey, idKey,path} = Object.assign(\n        { startId: null }, DefaultTreeOptions, options || {}) as Required<ForEachTreeOptions>\n    // 当指定startId时用来标识是否开始调用callback\n    let isStart = startId == null ? true : (typeof (treeData) == 'object' ? String((treeData as Node)[idKey]) === String(startId) : false)\n    let isAbort = false\n\n    const generatePath = buildPathGenerator(path,idKey)\n\n    function forEachNode(node: Node, level = 1, parent: Node | null, parentPath: any[], index: number): boolean | undefined {\n        const curPath = [...parentPath,generatePath(node)]\n        if (isAbort) return\n        let result: any = true\n        if (isStart === false && startId != null) {\n            isStart = String(node[idKey]) === String(startId)\n        }\n        // skip参数决定是否执行跳过节点而不执行callback\n        if (isStart) {\n            //如果在Callback中返回false则\n            result = callback({ node, level, parent, path:curPath, index })\n            if (result === ABORT) {\n                isAbort = true\n                return\n            }\n        }\n        let children = node[childrenKey]\n        if (children && Array.isArray(children) && children.length > 0) {\n            level += 1\n            for (let i = 0; i < children.length; i++) {\n                result = forEachNode(children[i], level, node, curPath, i)\n                if (result === ABORT) return false\n            }\n        }\n    }\n    if (Array.isArray(treeData)) {\n        treeData.forEach((node, index) => forEachNode(node, 1, null, [], index))\n    } else {\n        forEachNode(treeData, 1, null, [], -1)\n    }\n}\n "]}