友情提示:閱讀本文需花 3分鍾左右!
- 遞歸函數必須接受參數。 (比如我要遞歸誰?)
- 在遞歸函數的定義初始,應該有一個判斷條件,當參數滿足這個條件的時候,函數停止執行,並返回值。(指定退出條件,否則就會死循環)
- 每次遞歸函數執行自己的時候,都需要把當前參數做某種修改,然后傳入下一次遞歸。(每次循環在調用自己一次並傳參)
- 當參數被累積修改到符合初始判斷條件了,遞歸就停止了。(最后滿足條件就退出)
一句話概括:所謂的遞歸函數就是在函數體內調用n次本函數。
幼兒園化: 自己玩自己(強擼灰飛XX),或者累了(滿足條件)自己退出。
具體示例(直接復制可運行):
// 遞歸簡單demo
let num = 0;
function recursion(params) {
if (params > 100) {
return
} else {
//debugger
num += params;
return recursion(params + 1)
}
}
recursion(0)
console.log(num); // 5050
// 遞歸升級版,遞歸樹
const data = [{
"area_id": 5,
"name": "廣東省",
"parent_id": 0,
}, {
"area_id": 6,
"name": "廣州市",
"parent_id": 5,
}, {
"area_id": 7,
"name": "深圳市",
"parent_id": 5,
}, {
"area_id": 4,
"name": "北京市",
"parent_id": 3,
}, {
"area_id": 3,
"name": "北京",
"parent_id": 0,
}, {
"area_id": 2,
"name": "測試子地區",
"parent_id": 1,
}, {
"area_id": 1,
"name": "測試地區",
"parent_id": 0,
}]
function toTreeData(data, pid) {
function tree(id) {
let arr = []
data.filter(item => {
return item.parent_id === id;
}).forEach(item => {
console.log(arr.length);
if (!tree(item.area_id).length) {
arr.push({
area_id: item.area_id,
label: item.name,
})
} else {
arr.push({
area_id: item.area_id,
label: item.name,
children: tree(item.area_id)
})
}
})
return arr
}
return tree(pid) // 第一級節點的父id,是null或者0,視情況傳入
}
console.log(toTreeData(data, 0));
結果如下
