递归的实际使用场景

数据源:
复制代码
      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])

 

posted @   吴小明-  阅读(187)  评论(0编辑  收藏  举报
编辑推荐:
· 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、组件
点击右上角即可分享
微信分享提示