递归的实际使用场景
数据源:
const tree = [
{
value: '一级 1',
text: '一级 1',
children: [
{
value: '二级 1-1',
text: '二级 1-1',
children: [
{
value: '三级 1-1-1',
text: '三级 1-1-1',
children: [
{ value: '四级 1-1-1-1', text: '四级 1-1-1-1' },
{ value: '四级 1-1-1-2', text: '四级 1-1-1-2' }
]
},
{ value: '三级 1-1-2', text: '三级 1-1-2' }
]
},
{
value: '二级 1-2',
text: '二级 1-2',
children: [
{ value: '三级 1-2-1', text: '三级 1-2-1' },
{ value: '三级 1-2-2', text: '三级 1-2-2' }
]
}
]
},
{
value: '一级 2',
text: '一级 2',
children: [
{
value: '二级 2-1',
text: '二级 2-1',
children: [
{ value: '三级 2-1-1', text: '三级 2-1-1' },
{ value: '三级 2-1-2', text: '三级 2-1-2' }
]
},
{ value: '二级 2-2', text: '二级 2-2' }
]
},
{
value: '一级 3',
text: '一级 3',
children: [
{ value: '二级 3-1', text: '二级 3-1' },
{ value: '二级 3-2', text: '二级 3-2' }
]
}
]
1、递归去除falg为false的项
const filterFalseByFlag = tree =>cloneDeep(tree).filter(item => { if (item.children?.length) item.children = filterFalseByFlag(item.children) return item.flag })
2、递归为每层数据添加level
const setLevel = (tree, level = 1) => cloneDeep(tree).map(item => { item.level = level if (item.children?.length) item.children = setLevel(item.children, level + 1) return item })
3、根据value值获取该节点所有的父级节点
const getParentsByValue = (tree, value) => { for (const item of tree) { if (item.children?.length) { const nodeList = getParentsByValue(item.children, value) if (nodeList) return nodeList.concat(item) } if (item.value === value) return [item] } }
const parents = getParents(tree, '四级 1-1-1-1')
4、根据value获取当前节点(依赖于getParentsByValue)
const getNodeByValue = (tree, value) => { const parents = getParentsByValue(tree, value) return parents.find(item => item.value === value) }
另一种方式(不依赖getParentsByValue,这个比较好):
const getNodeByValue = (tree, value) => { for (const item of tree) { if (item.value === value) { return item } else if (item.children?.length) { const node = getNodeByValue(item.children, value) if (node) return node } } }
5、获取当前节点的所有子节点(依赖于getParentsByValue和getNodeByValue)
const getChildsByNode = (list, childs = []) => { for (const item of list) { childs.push(item) if (item.children?.length) getChildsByNode(item.children, childs) } return childs }
const node = getNodeByValue(tree, '二级 1-2')
const childs = getChildsByNode([node])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-02-24 vue-day06----过渡&动画(transition)、axios、axios以post方式请求数据、axios常用的配置项、axios拦截器、qs处理数据、vue中async和await的使用
2020-02-24 vue-day05----自定义指令(directive)、render和template的区别、mixin混入、Vue.use()、Vue.extend()、Vue.filter()、vue中的数据流向
2020-02-24 vue-day04----组件传值、provide/inject、插槽(slot)、动态组件、keep-alive、directive
2020-02-24 vue-day03----webpack搭建vue环境、移动端适配(reset.css)
2020-02-24 vue-day01&day02----vue渐进式MVVM框架、new操作符做了哪些事、指令、事件修饰符、浏览器按下回车后发生了什么、浏览器渲染页面的流程、虚拟DOM的特点、回流和重绘、computed、vue实例身上的方法、watch监听、生命周期、ref、组件