1、什么是递归
递归就是一个函数调用自身,直到达到某个特定状态。
注意:使用递归函数一定要注意,处理不当就会进入死循环。
2、简单例子(阶乘)
function factorial(num) {
if (num <= 1) {
return 1;
} else {
return num*factorial(num-1);
}
}
factorial(3); // 结果为6
以下代码可能导致出错:
var anothorFactorial = factorial;
factorial = null;
alert(anothorFactorial(4)); // 出错
以上代码先把 factorial() 函数保存在变量 anothorFactorial 中,然后将 factorial 变量设置为 null,结果指向原始函数的引用只剩下一个。但在接下来调用 anothorFactorial() 时,由于必须执行 factorial(),而 factorial 已经不再是函数,所以就会导致错误。
使用 arguments.callee 解决:
arguments.callee 是一个指向正在执行的函数的指针,arguments.callee 返回正在被执行的对象,因此可以用它来实现对函数的递归调用。
新的函数为:
function factorial(num) {
if (num <= 1) {
return 1;
} else {
return num*arguments.callee(num-1);
}
}
var anothorFactorial = factorial;
factorial = null;
alert(anothorFactorial(4)); // 结果为24
3、应用递归
用递归的方法把 jsonArray 转成树形的 json 对象。
初始化数据:
var json = [
{id:1,parent:0,name:'杭州市'},
{id:2,parent:1,name:'余杭区'},
{id:3,parent:1,name:'西湖区'},
{id:4,parent:1,name:'滨江区'},
{id:5,parent:0,name:'北京市'},
{id:6,parent:5,name:'海淀区'},
{id:7,parent:2,name:'高教路'}
];
递归方法:
function changeData(data, id) {
const result = [];
let temp = [];
for (let i =0;i < data.length;i++) {
if (data[i].parent === id) {
const obj = {'title': data[i].name,'children':temp};
temp =this.changeData(data, data[i].id);
obj.children =temp
result.push(obj)
}
}
return result
}
调用输出:
console.log(changeData(json,0));
输出结果: