js 遞歸的理解


友情提示:閱讀本文需花 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));
結果如下

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM