import { cloneDeep } from 'lodash-es'
export function treeForEach(tree: any[], cb: (item: any) => unknown, children = 'children', mode = 'DFS'): void {
if (!Array.isArray(tree)) {
throw new TypeError('tree is not an array')
}
if (typeof children !== 'string') {
throw new TypeError('children is not a string')
}
if (children === '') {
throw new Error('children is not a valid string')
}
function DFS(treeData: any[]) {
for (const item of treeData) {
cb(item)
if (Array.isArray(item[children])) {
DFS(item[children])
}
}
}
function BFS(treeData: any[]) {
const queen = treeData
while (queen.length > 0) {
const item = queen.shift()
cb(item)
if (Array.isArray(item[children])) {
queen.push(...item[children])
}
}
}
if (mode === 'BFS') {
BFS(tree)
} else {
DFS(tree)
}
}
export function treeToList(tree: Array<any>, children = 'children', mode = 'DFS'): Array<any> {
if (!Array.isArray(tree)) {
throw new TypeError('tree is not an array')
}
if (typeof children !== 'string') {
throw new TypeError('children is not a string')
}
if (children === '') {
throw new Error('children is not a valid string')
}
tree = cloneDeep(tree)
const list: any = []
treeForEach(tree, (item : any) => {
list.push(item)
}, children, mode)
list.forEach((item: any) => {
delete item[children]
})
return list
}
interface Options {
rootID?: string,
id?: string,
pid?: string,
children?: string
}
export function listToTree(list: any[], options:Options): Array<any> {
const {
rootID = null,
id = 'id',
pid = 'pid',
children = 'children'
} = options || {}
if (!Array.isArray(list)) {
throw new TypeError('list is not an array')
}
if (typeof children !== 'string') {
throw new TypeError('children is not a string')
}
if (children === '') {
throw new Error('children is not a valid string')
}
list = cloneDeep(list)
const tree: any = []
const map = list.reduce((res, item) => {
res.set(item[id], item)
return res
}, new Map())
Array.from(map.keys()).forEach(key => {
const node = map.get(key)
if (node[pid] === rootID) {
tree.push(node)
} else {
const pNode = map.get(node[pid])
if (Array.isArray(pNode[children])) {
pNode[children].push(node)
} else {
pNode[children] = [node]
}
}
})
return tree
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~