UNPKG

@cloudcome/utils-core

Version:
211 lines (210 loc) 7.19 kB
import { AnyObject } from './types'; /** * 表示深度遍历中的节点对象,包含子节点列表。 */ export type TreeItem = AnyObject & { /** * 子节点列表。 */ children?: TreeItem[]; }; /** * 表示深度遍历中的节点列表。 * * @template I - 节点对象的类型,必须继承自 `TreeItem`。 */ export type TreeList<I extends TreeItem> = I[]; /** * 表示深度遍历中的遍历器状态。 * * @template I - 节点对象的类型,必须继承自 `TreeItem`。 */ export type TreeWalker<I extends TreeItem> = { /** * 当前层级的节点列表。 */ list: TreeList<I>; /** * 当前节点的父节点,如果为根节点则为 `null`。 */ parent: I | null; /** * 当前节点的层级,从 1 开始计数。 */ level: number; /** * 从根节点到当前节点的路径。 */ path: TreeList<I>; }; /** * 表示深度遍历中的节点信息。 * * @template I - 节点对象的类型,必须继承自 `TreeItem`。 */ export type TreeInfo<I extends TreeItem> = TreeWalker<I> & { /** * 当前节点。 */ item: I; /** * 当前节点在 `list` 中的索引。 */ index: number; }; /** * 深度遍历的同步迭代器函数类型。 * * @template I - 节点对象的类型,必须继承自 `TreeItem`。 * @param info - 当前节点的信息。 * @returns 如果返回 `false`,则提前终止遍历。 */ export type TreeEachIterator<I extends TreeItem> = (info: TreeInfo<I>) => false | unknown; /** * 深度遍历的异步迭代器函数类型。 * * @template I - 节点对象的类型,必须继承自 `TreeItem`。 * @param info - 当前节点的信息。 * @returns 如果返回 `false`,则提前终止遍历。 */ export type TreeEachIteratorAsync<I extends TreeItem> = (info: TreeInfo<I>) => Promise<boolean | unknown>; /** * 深度遍历的同步遍历器函数类型。 * * @template I - 节点对象的类型,必须继承自 `TreeItem`。 * @param walker - 遍历器状态。 * @returns 遍历结果。 */ export type TreeWalk<I extends TreeItem> = (walker: TreeWalker<I>) => unknown; /** * 深度遍历的异步遍历器函数类型。 * * @template I - 节点对象的类型,必须继承自 `TreeItem`。 * @param walker - 遍历器状态。 * @returns 异步遍历结果。 */ export type TreeWalkAsync<I extends TreeItem> = (walker: TreeWalker<I>) => Promise<unknown>; /** * 深度遍历数组中的每个元素,并对每个元素执行提供的回调函数。 * * @param treeList - 要遍历的深度数组。 * @param iterator - 对每个元素执行的回调函数。如果回调函数返回 `false`,则提前终止遍历。 * @param breadthFist - 是否使用广度优先遍历,默认为 `false`(深度优先)。 * @returns 无返回值。 * * @example * ```typescript * const treeList = [ * { value: 1, children: [{ value: 2 }, { value: 3 }] }, * { value: 4 } * ]; * * treeEach(treeList, (item) => { * console.log(item.value); * if (item.value === 2) return false; // 提前终止遍历 * }); * ``` */ export declare function treeEach<I extends TreeItem = TreeItem>(treeList: TreeList<I>, iterator: TreeEachIterator<I>, breadthFist?: boolean): void; /** * 在深度数组中查找满足条件的第一个节点信息。 * * @param treeList - 要查找的深度数组。 * @param predicate - 判断节点是否满足条件的回调函数。 * @param breadthFist - 是否使用广度优先查找,默认为 `false`(深度优先)。 * @returns 如果找到满足条件的节点,则返回该节点的信息;否则返回 `undefined`。 * * @example * ```typescript * const treeList = [ * { value: 1, children: [{ value: 2 }, { value: 3 }] }, * { value: 4 } * ]; * * const found = treeFind(treeList, (info) => info.item.value === 3); * console.log(found); * // { * // item: { value: 3 }, * // index: 1, * // list: [{ value: 2 }, { value: 3 }], * // parent: { value: 1, children: [{ value: 2 }, { value: 3 }] }, * // level: 2, * // path: [{ value: 1, children: [{ value: 2 }, { value: 3 }] }, { value: 3 }] * // } * ``` */ export declare function treeFind<I extends TreeItem>(treeList: TreeList<I>, predicate: (info: TreeInfo<I>) => boolean, breadthFist?: boolean): TreeInfo<I> | undefined; /** * 将深度嵌套的树形结构扁平化为一维数组,并对每个节点执行指定的转换函数。 * * @template I - 树节点的类型,必须继承自 `TreeItem`。 * @template T - 转换后的数据类型。 * @param {TreeList<I>} deepList - 要扁平化的深度嵌套树形结构。 * @param {(info: TreeInfo<I>) => T} flatten - 对每个节点执行的转换函数,返回转换后的数据。 * @param {boolean} [breadthFist=false] - 是否使用广度优先遍历,默认为 `false`(深度优先)。 * @returns {T[]} - 转换后的一维数组。 * @example * ```typescript * const treeList = [ * { value: 1, children: [{ value: 2 }, { value: 3 }] }, * { value: 4 } * ]; * * const flattened = deepFlat(treeList, (info) => info.item.value); * console.log(flattened); // [1, 2, 3, 4] * ``` */ export declare function deepFlat<I extends TreeItem, T>(deepList: TreeList<I>, flatten: (info: TreeInfo<I>) => T, breadthFist?: boolean): T[]; type FromItemInfo<I> = { selfKey: unknown; parentKey: unknown; item: I; index: number; }; export type TreeFromOptions<I extends TreeItem> = { getSelfKey: (item: I, index: number) => unknown; getParentKey: (item: I, index: number) => unknown; appendChild: (parentInfo: FromItemInfo<I>, info: FromItemInfo<I>) => unknown; }; /** * 从扁平列表构建树形结构。 * * @template I - 节点对象的类型,必须继承自 `AnyObject`。 * @param {I[]} list - 扁平化的节点列表。 * @param {TreeFromOptions<I>} options - 构建树形结构的配置选项。 * @param {function} options.getSelfKey - 获取节点自身唯一标识的函数。 * @param {function} options.getParentKey - 获取节点父节点唯一标识的函数。 * @param {function} options.appendChild - 将子节点添加到父节点的函数。 * @returns {I | undefined} - 构建的树形结构的根节点,如果未找到根节点则返回 `undefined`。 * * @example * ```typescript * const list = [ * { id: 1, parentId: null, name: 'Root' }, * { id: 2, parentId: 1, name: 'Child 1' }, * { id: 3, parentId: 1, name: 'Child 2' } * ]; * * const tree = treeFrom(list, { * getSelfKey: (item) => item.id, * getParentKey: (item) => item.parentId, * appendChild: (parent, info) => { * if (!parent.children) parent.children = []; * parent.children.push(info.item); * } * }); * * console.log(tree); * // { * // id: 1, * // parentId: null, * // name: 'Root', * // children: [ * // { id: 2, parentId: 1, name: 'Child 1' }, * // { id: 3, parentId: 1, name: 'Child 2' } * // ] * // } * ``` */ export declare function treeFrom<I extends TreeItem>(list: I[], options: TreeFromOptions<I>): TreeList<I> | undefined; export {};