1.代码实现
function recursive<T>(
arr: T[],
childKey: keyof T,
fn:
(e: T,
group: T[],
level?: number,
indexInParent?: number,
path?: T[]) => void | never,
level?: number,
basePath?: T[]
) {
if (level !== undefined) level++
arr.forEach((_: T, index: number) => {
const path = []
if (basePath !== undefined) {
path.push(...basePath, _)
}
fn(_, arr, level, index, path);
const e = <T[]><unknown>_[childKey];
if (!e || !Array.isArray(e)) return
recursive<T>(e, childKey, fn, level, path);
});
}
2.代码示例
interface Data {
id: number,
children?: Data[]
}
const data: Data[] = [
{ id: 1, children: [{ id: 11, children: [] },{ id: 12, children: [] }] },
{ id: 2, children: [{ id: 21, children: [] },{ id: 22, }] },
{ id: 3, children: [{ id: 31, children: [{id:311}] },{ id: 32, children: [{id:321}] }] },
{ id: 4, children: [{ id: 41, children: [] },{ id: 42, children: [] }] },
]
recursive(data, 'children', (e, group, level, indexInParent, path) => {
console.log(e.id, group.map(_=>_.id), level, indexInParent, path?.map(_=>_.id));
}, 0, [])
