递归,递归实现数组转树

递归,什么是递归

让我们看看官网怎么说

https://developer.mozilla.org/zh-CN/docs/Glossary/Recursion

函数自己调用自己?

我们小时候都听过一个故事,从前有座庙,庙里有座山,庙里有个老和尚讲故事,讲的从前有座山,山里有座庙,庙里有个老和尚....

递归函数

我们这里就涉及到一个陷入一个没有跳出条件的死循环,而每次,都是这个老和尚带我们进入循环,所以,我们可以理解为,这个老和尚就是函数,一个递归函数

   function sum(n){
    // 循环条件
    if (n>0) {
            // 这里我们可以理解为
            /*
              sum((n-1)-1) + n
              sum(((n-1)-1)-1)
              .......
              最后就是
              n == 1 的时候 今年入循环,返回0
            */
     return sum(n-1) + n
    }else{
      return 0
    }
  }
  let index = sum(10)
  console.log(index);

从sum(..(..(n-...).)..)内往外看的话就是0+1+2+3+....10

或者说

function sum(n){
    // 循环条件
    // if (n>0) {
    //         // 这里我们可以理解为
    //         /*
    //           sum((n-1)-1) + n
    //           sum(((n-1)-1)-1)
    //           .......
    //           最后就是
    //           n == 1 的时候 今年入循环,返回0
    //         */
    //  return sum(n-1) + n
    // }else{
    //   return 0
    // }
    if(n<=1)return 1
    return sum (n-1) + n
  }

效果也是一样的

说到这里就不得不聊到我最近一个业务,数组转树,递归实现

随便搞点数据

  const arr = [
  { id: '00', parentId: '', 'name': '做梦' },
  { id: '01', parentId: '00', 'name': '只因' },
  { id: '02', parentId: '01', 'name': '战' },
  { id: '03', parentId: '02', 'name': '坤' },
  { id: '04', parentId: '02', 'name': '凡' }
]

我们可以一眼直观的看出来,只因是做梦的小弟,战是子因的小弟

初步判断,需要根据parentId来找

const data= [
  { id: '00', parentId: '', 'name': '做梦' },
  { id: '01', parentId: '00', 'name': '只因' },
  { id: '02', parentId: '01', 'name': '战' },
  { id: '03', parentId: '02', 'name': '坤' },
  { id: '04', parentId: '02', 'name': '凡' }
]
function arrToTree(data,pid=''){
  let arr =[]
  data.forEach(item => {
    // 取出所有对象
    console.log(item)
  });
  return 0
}
const index = arrToTree(data)
console.log(index);

接下来找出所有顶级,也就是parentId == ''

const data= [
  { id: '00', parentId: '', 'name': '做梦' },
  { id: '01', parentId: '00', 'name': '只因' },
  { id: '02', parentId: '01', 'name': '战' },
  { id: '03', parentId: '02', 'name': '坤' },
  { id: '04', parentId: '02', 'name': '凡' }
]
function arrToTree(data,pid=''){
  let arr =[]
  data.forEach(item => {
    // 取出所有对象
    // console.log(item)
    // 找出所有一级
    if(item.parentId == pid){
      arr.push(item)
    }
  });
  return arr
}
const index = arrToTree(data)
console.log(index);

只有一个

再来继续找二级

 const data= [
  { id: '00', parentId: '', 'name': '做梦' },
  { id: '01', parentId: '00', 'name': '只因' },
  { id: '02', parentId: '01', 'name': '战' },
  { id: '03', parentId: '02', 'name': '坤' },
  { id: '04', parentId: '02', 'name': '凡' }
]
function arrToTree(data,pid=''){
  let arr =[]
  data.forEach(item => {
    // 取出所有对象
    // console.log(item)
    // 找出所有一级
    if(item.parentId == pid){
      // 找二级,递归
      const children = arrToTree(data,item.id)
      // 如果有子级
      if (children.length) {
        item.children = children
      }
      arr.push(item)
    }
  });
  return arr
}
const index = arrToTree(data)
console.log(index);

收工

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值