JS 递归循环

495 阅读1分钟

递归

其实递归没有什么可解释的含义, 就是函数自己调用自己本身,或者在自己函数调用下的下级函数中调用自己。所有的递归都可以用来循环来实现。

简单看一下递归的求和
//可以看到这个数组套了4层,是比较复杂的结构
let arr = [100,200,300,[400,500,[49,59,80,[232,535,77]]]]

//声明初始值,用来保存求和后的总数
let bed = 0

function fn(arr){
    //循环数组
   arr.forEach((item) => {
    // 判断数组中的每一项是否是数字类型,(准确来说是判断第一层,因为在正常业务逻辑中,我们是不指定数组的具体结构的,更不清楚数组到底嵌套了基层)
    if(typeof item == "number"){
        //遇到数字类型的值就累加求和 并返回出去
        return bed+=item
    }else{
        //如果循环到了不是数字的,就重新调用自己,再进行循环。
        fn(item)
    }
   })
}

fn(arr)
console.log(bed);  //2532

再来看一个这样的数据结构

let arr1 = [
  {
    name: "张三",
    money: 100,
    children: [
      { name: "张欢欢", money: 200 },
      {
        name: "张乐乐",
        money: 100,
        children: [
          { name: "张小欢", money: 300 },
          { name: "张小乐", money: 400 },
        ],
      },
    ],
  },
  {
    name: "李四",
    money: 100,
    children: [
      { name: "李红红", money: 500 },
      { name: "李明明", money: 600 },
    ],
  },
];

我们需要把所有 money 项累加起来

//设置总和初始值
let num = 0

function fn(arr){
   //循环遍历数组
   arr.forEach((item) => {
    //从第一层开始遇到money就累加求和
      num += item.money
      //如果遇到有children就重新调用函数,对children项再进行循环
     if(item.children){
        fn(item.children)
     }
   })
}
fn(arr1)

console.log(num); //2300