1.含义
递归:指的是函数自己调用自己
2.简单例子-调用过程
calFact(num) {
if (num == 1){
return 1
} else{
return this.calFact(num-1)
}
}
// 调用方法
console.log('value', this.calFact(3))// 最终打印结果为1
调用时,该函数进入调用栈:栈的特点-参数从栈底开始叠起来,最顶部的完成后最先弹出(后进先出)。
下图方框处就是调用栈
num=3,num=3放入栈底。走的else条件再次调用自己
num=2,继续放入栈中叠在num=3上,再次符合else条件调用自己
num=1,继续放入栈中在num=2上,成功return 1
函数执行完成,调用栈顶的num=1返回弹出调用栈,往下依次弹出num的值。
注意每次调用栈中的变量是不能当前变量的上一层或下一层的值。
3.项目运用
在一个未知级别的复杂数组中,根据给定的key值查找它对应的name进行回显。
分析:因为数组里面会有多层嵌套children数组,单用循环不好分析。用递归+循环可解决。
let testArr = [{key:'1',name:'aa',children:[{key:'a1',name:'0a'},{key:'a2',name:'1a'}]},
{key:'2',name:'bb'},
{key:'3',name:'cc',children:[{key:'c1',name:'c1'},{key:'c2',name:'c2',children:[{key:'xx',name:'ww'}]}]},
]
this.calMath(key,arr) {
arr.forEach(item => {
if (item.key === key) {// 找到直接赋值
result = item.name;
} else if (item.children && item.children.length > 0) {// 未找到且有children数组时去该数组遍历查询
calMath(key, item.children);
}
})
})
}
// 调用查询key
var result = nul;
this.calMath('xx',testArr) // result=ww
小知识:递归并不能提高程序性能,但程序可能更容易理解。