递归,什么是递归
让我们看看官网怎么说
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);
收工