国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

算法-無限分類遞歸

zhonghanwen / 1818人閱讀

摘要:作為前端不用算法也可以寫成項目但是如果明白會算法的話你寫起代碼來會更得心應手無限分類遞歸多數用在樹形結構數據有這樣一組數據張三的兒子張三的兒子李四的兒子張三的兒子的兒子張三李四王五想要得到的結果是這樣子的張三張三的兒子張三的兒子的兒子張三的

作為前端, 不用算法也可以寫成項目. 但是如果明白會算法的話, 你寫起代碼來會更得心應手.
無限分類遞歸 多數用在樹形結構數據. 有這樣一組數據:
const arr = [
    {
        id: 4,
        name: "張三的兒子",
        parentId: 1
    },
    {
        id: 43,
        name: "張三的2兒子",
        parentId: 1
    },
    {
        id: 5,
        name: "李四的兒子",
        parentId: 2
    },
    {
        id: 6,
        name: "張三的兒子的兒子",
        parentId: 4
    },
    {
        id: 1,
        name: "張三",
        parentId: 0
    },
    {
        id: 2,
        name: "李四",
        parentId: 0
    },
    {
        id: 3,
        name: "王五",
        parentId: 0
    },
];

想要得到的結果是這樣子的:

const result = [
    {
        id: 1,
        name: "張三",
        parentId: 0,
        children: [
            {
                id: 4,
                name: "張三的兒子",
                parentId: 1,
                children: [
                    {
                        id: 6,
                        name: "張三的兒子的兒子",
                        parentId: 4
                    }
                ]
            },
            {
                id: 43,
                name: "張三的2兒子",
                parentId: 1
            }
        ]
    },
    {
        id: 2,
        name: "李四",
        parentId: 0,
        children: [
            {
                id: 5,
                name: "李四的兒子",
                parentId: 2
            }
        ]
    },
    {
        id: 3,
        name: "王五",
        parentId: 0
    }
];

這里我有兩種做法:

遞歸

充分利用數據的引用(堆棧)

第一種:

function rescurve(arr, id) {
    let treeData = [];
    arr.forEach(i => {
        if(i.parentId == id) {
            treeData.push(i);
            i.children = rescurve(arr, i.id);
        }
    });
    return treeData;
};
console.log(rescurve(arr, 0)); // 輸出正確的值

這種方法沒什么說的 就是執行自身遞歸出想要的結構.

第二種:

function setTreeData(arr) {
    let map = {}; // 構建map
    arr.forEach(i => {
        map[i.id] = i; // 構建以id為鍵 當前數據為值
    });

    let treeData = [];
    arr.forEach(child => {
        const mapItem = map[child.parentId]; // 獲取當前數據的parentId是否存在map中

        if (mapItem) { // 存在則表示當前數據不是最頂層數據
        
            // 注意: 這里的map中的數據是引用了arr的它的指向還是arr, 當mapItem改變時arr也會改變
            (mapItem.children || ( mapItem.children = [] )).push(child); // 這里判斷mapItem中是否存在children, 存在則插入當前數據, 不存在則賦值children為[]然后再插入當前數據
        } else { // 不存在則是組頂層數據
            treeData.push(child);
        }
    });

    return treeData;
};

console.log(setTreeData(arr)); // 輸出正確的值

這里需要注意的是對象的引用, 利用對象的引用改變指向的arr的數據. 就得到想要的結構

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107745.html

相關文章

  • 遞歸算法造成的問題分析與解決

    摘要:整理一下,形成今天的內容算法中的遞歸算法。解決來看一下,最終形態的遞歸方法是什么樣子遞歸運算創建樹結構聲明靜態變量給靜態變量累加值賦值閉合標簽這樣就可以解決了。所以,在之后的遞歸算法中,應該小心謹慎,避免出現問題。 原文是在我自己博客中,小伙伴也可以點閱讀原文進行跳轉查看,還有好聽的背景音樂噢~ ????遞歸,在編碼中應該算是一種很常見的算法了。之前在學習C語言的時候,也同樣了解過一些...

    gekylin 評論0 收藏0
  • 算法算法圖解筆記_遞歸

    遞歸是個有意思的概念,正如在前面所說,遞歸能讓算法的可讀性大大提高,而且通常要比使用循環結構更能寫出準確的算法。這本書形象引入了遞歸,并沒有太深入,所以我進行了一點添油加醋。 遞歸 概念 遞歸其實就是自己調用自己。可以從多種維度對遞歸分類,我見過的最常見的分類: 直接遞歸 自己直接調用自己。如: --haskell length :: [a] -> Int length [] = 0 length...

    tomlingtm 評論0 收藏0
  • 超優雅!node.js 無限分類,無遞歸獲取所有下級分類ID。

    摘要:昨天幫同事解決問題,于是誕生了超優雅兩行代碼搞定無限級分類獲取頂級分類這篇文章。這次要解決的問題是根據分類,獲取所有下級分類的,這里說的所有下級分類,是包含下級下下級下下下級另外剛好在學習,于是用上了對象。 昨天幫同事解決問題,于是誕生了超優雅!兩行代碼搞定 php 無限級分類 獲取頂級分類ID這篇文章。 晚上回家做自己的node.js項目的時候,又遇到關于無限級分類的問題了。其實也不...

    calx 評論0 收藏0
  • PHP中的無限分類無限嵌套評論

    摘要:可以看到,我們首先獲取到了所有的數據,然后按照父級歸類。無限嵌套評論先來看下這個無限嵌套評論長什么樣子。文件掃描使用遞歸進行目錄文件的掃描的栗子。 回顧 上一篇文章我們講到實戰PHP數據結構基礎之遞歸。來回顧下什么是遞歸? 一般來說,遞歸被稱為函數自身的調用。 遞歸在開發中的實際運用 N級分類 無限級的分類在平常的開發中是常見的需求,并且在不少面試題中都會碰到。不管你做什么項目,應該都...

    Shisui 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<