扁平数组转tree
扁平数组转tree
需要用到的测试数据
let flatArr = [
{ id:1, title:'标题1', parent_id:0 },
{ id:2, title:'标题2', parent_id:0 },
{ id:3, title:'标题2-1', parent_id:2 },
{ id:4, title:'标题3-1', parent_id:3 },
{ id:5, title:'标题4-1', parent_id:4 },
{ id:6, title:'标题2-2', parent_id:2 },
]
使用 reduce 实现
const convert = (list)=>{
const result = []
const map = list.reduce((pre,cur)=>{
pre[cur.id] = cur
return pre
},{})
for(let item of list){
if(item.parent_id === 0){
result.push(item)
continue
}
if(item.parent_id in map){
const parent = map[item.parent_id]
parent.childer = parent.childer || []
parent.childer.push(item)
}
}
return result
}
const res = convert(flatArr)
console.time()
console.log(convert(flatArr));
console.timeEnd()
使用 filter 实现
const convert2 = (list)=>{
const result = []
list.forEach(r => {
r.childer = list.filter(re=> re.parent_id === r.id)
if(r.parent_id === 0){
result.push(r)
}
});
return result
}
console.time()
console.log(convert2(flatArr));
console.timeEnd()
Tree 转 扁平化数组
const flatten = (arr)=>{
return arr.reduce((pre,cur)=>{
const {id,title,parent_id,childer = []} = cur
return pre.concat([{id,title,parent_id}], flatten(childer))
},[])
}
console.log(flatten(res));
另一种思路
const listToTree = (list = [], id = 'id', pid = 'pid') => {
const map = new Map()
const newList = []
list.forEach(item => {
map.set(item[id], item)
})
list.forEach(item => {
if (Number(item[pid]) === 0 || !map.get(item[pid])) {
newList.push(item)
}
const v = map.get(item[pid])
if (v) {
if (Array.isArray(v.children)) {
v.children.push(item)
} else {
v.children = [item]
}
}
})
return newList
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异