日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

js用递归遍历多维数组_JavaScript树结构操作:查找、遍历、筛选、树结构和列表结构相互转换...

發布時間:2025/3/15 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js用递归遍历多维数组_JavaScript树结构操作:查找、遍历、筛选、树结构和列表结构相互转换... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

經常有同學問樹結構的相關操作,也寫了很多次,在這里總結一下JS樹形結構一些操作的實現思路,并給出了簡潔易懂的代碼實現。

本文內容結構大概如下:

一、遍歷樹結構

1. 樹結構介紹

JS中樹結構一般是類似于這樣的結構:

let

為了更通用,可以用存儲了樹根節點的列表表示一個樹形結構,每個節點的children屬性(如果有)是一顆子樹,如果沒有children屬性或者children長度為0,則表示該節點為葉子節點。

2. 樹結構遍歷方法介紹

樹結構的常用場景之一就是遍歷,而遍歷又分為廣度優先遍歷、深度優先遍歷。其中深度優先遍歷是可遞歸的,而廣度優先遍歷是非遞歸的,通常用循環來實現。深度優先遍歷又分為先序遍歷、后序遍歷,二叉樹還有中序遍歷,實現方法可以是遞歸,也可以是循環。

廣度優先和深度優先的概念很簡單,區別如下:

  • 深度優先,訪問完一顆子樹再去訪問后面的子樹,而訪問子樹的時候,先訪問根再訪問根的子樹,稱為先序遍歷;先訪問子樹再訪問根,稱為后序遍歷。
  • 廣度優先,即訪問樹結構的第n+1層前必須先訪問完第n層

3. 廣度優先遍歷的實現

廣度優先的思路是,維護一個隊列,隊列的初始值為樹結構根節點組成的列表,重復執行以下步驟直到隊列為空:

  • 取出隊列中的第一個元素,進行訪問相關操作,然后將其后代元素(如果有)全部追加到隊列最后。

下面是代碼實現,類似于數組的forEach遍歷,我們將數組的訪問操作交給調用者自定義,即一個回調函數:

// 廣度優先

很簡單吧,~,~

用上述數據測試一下看看:

treeForeach

輸出,可以看到第一層所有元素都在第二層元素前輸出:

>

4. 深度優先遍歷的遞歸實現

先序遍歷,三五行代碼,太簡單,不過多描述了:

function

后序遍歷,與先序遍歷思想一致,代碼也及其相似,只不過調換一下節點遍歷和子樹遍歷的順序:

function

測試:

treeForeach

輸出:

// 先序遍歷

5. 深度優先循環實現

先序遍歷與廣度優先循環實現類似,要維護一個隊列,不同的是子節點不追加到隊列最后,而是加到隊列最前面:

function

后序遍歷就略微復雜一點,我們需要不斷將子樹擴展到根節點前面去,(艱難地)執行列表遍歷,遍歷到某個節點如果它沒有子節點或者它的子節點已經擴展到它前面了,則執行訪問操作,否則擴展子節點到當前節點前面:

function

二、列表和樹結構相互轉換

1. 列表轉為樹

列表結構通常是在節點信息中給定了父級元素的id,然后通過這個依賴關系將列表轉換為樹形結構,列表結構是類似于:

let

列表結構轉為樹結構,就是把所有非根節點放到對應父節點的chilren數組中,然后把根節點提取出來:

function

這里首先通過info建立了id=>node的映射,因為對象取值的時間復雜度是O(1),這樣在接下來的找尋父元素就不需要再去遍歷一次list了,因為遍歷尋找父元素時間復雜度是O(n),并且是在循環中遍歷,則總體時間復雜度會變成O(n^2),而上述實現的總體復雜度是O(n)。

2. 樹結構轉列表結構

有了遍歷樹結構的經驗,樹結構轉為列表結構就很簡單了。不過有時候,我們希望轉出來的列表按照目錄展示一樣的順序放到一個列表里的,并且包含層級信息。使用先序遍歷將樹結構轉為列表結構是合適的,直接上代碼:

//遞歸實現

三、樹結構篩選

樹結構過濾即保留某些符合條件的節點,剪裁掉其它節點。一個節點是否保留在過濾后的樹結構中,取決于它以及后代節點中是否有符合條件的節點。可以傳入一個函數描述符合條件的節點:

function

四、樹結構查找

1. 查找節點

查找節點其實就是一個遍歷的過程,遍歷到滿足條件的節點則返回,遍歷完成未找到則返回null。類似數組的find方法,傳入一個函數用于判斷節點是否符合條件,代碼如下:

function

2. 查找節點路徑

略微復雜一點,因為不知道符合條件的節點在哪個子樹,要用到回溯法的思想。查找路徑要使用先序遍歷,維護一個隊列存儲路徑上每個節點的id,假設節點就在當前分支,如果當前分支查不到,則回溯。

function

用上面的樹結構測試:

let

輸出:

[

3. 查找多條節點路徑

思路與查找節點路徑相似,不過代碼卻更加簡單:

function

五、結語

對于樹結構的操作,其實遞歸是最基礎,也是最容易理解的。遞歸本身就是循環的思想,所以可以用循環來改寫遞歸。熟練掌握了樹結構的查找、遍歷,應對日常需求應該是綽綽有余啦。

本文提及的樹結構操作函數,我已經將通用的版本發布到npm,如有需要,可以直接在項目中下載使用

作者:MuMa

總結

以上是生活随笔為你收集整理的js用递归遍历多维数组_JavaScript树结构操作:查找、遍历、筛选、树结构和列表结构相互转换...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产少妇在线 | 岛国av免费观看 | 蜜臀在线一区二区三区 | 亚洲无码高清精品 | 午夜视频在线网站 | 久久久黄色片 | 亚洲精品国产精 | 欧美日韩卡一卡二 | 91麻豆精品在线观看 | 色屁屁 | 天天射综合 | 亚洲久操 | www精品国产 | 日韩少妇毛片 | 99在线成人精品视频 | 色视频免费 | 五月天激情小说 | 狠狠干2022 | www插插插无码免费视频网站 | 91高跟黑色丝袜呻吟在线观看 | 午夜久久久久久噜噜噜噜 | 男生操女生在线观看 | 高清二区 | 亚洲欧美综合精品久久成人 | 色吧久久 | 亚洲一区二区在线电影 | 国产99久久九九精品无码 | 国产精品视频久久 | 国产农村乱对白刺激视频 | 中文字幕在线播出 | 欧美激情黑人 | 日韩人妻精品一区二区三区视频 | 国产精品极品白嫩 | 国产激情免费视频 | 欧美日韩高清一区二区 | 综合激情网五月 | 丁香婷婷视频 | 中国久久久 | 中文字幕乱码在线人视频 | 成人动漫在线观看视频 | 亚洲AV成人无码久久精品同性 | 婷婷五月综合激情 | 色91精品久久久久久久久 | 亚洲人成小说 | 久久99精品久久只有精品 | 国产在线1区 | 中文字幕一区二区三区四区欧美 | 久久av免费观看 | 亚洲在线不卡 | 中文区中文字幕免费看 | 在线观看免费av网站 | 特黄特色特刺激免费播放 | 一区二区三区免费毛片 | 亚洲黄色一级 | 黄av在线播放 | 国产精品第八页 | 国产欧美亚洲一区 | 欧美一a | 秋霞福利网 | 国产又黄又大又粗视频 | 久久国产精品久久精品国产 | av成人在线免费观看 | 国产做爰xxxⅹ高潮视频12p | 成年人小视频在线观看 | 少妇又色又紧又爽又刺激视频 | 日韩欧美aⅴ综合网站发布 国产成人一区二区三区小说 | 少妇一区二区三区四区 | 国产成人精品一区二区三区福利 | 伊人天堂av | 天天摸天天操 | 国产亚洲精品久久久久久打不开 | 国内av免费| 成人毛片a | 人妻熟女aⅴ一区二区三区汇编 | 午夜激情小视频 | 99国内精品 | 国产精品二 | 亚洲大片| 亚洲一本之道 | 久久精品—区二区三区舞蹈 | 亚洲色图导航 | 国产又粗又猛又爽又黄91精品 | 午夜亚洲aⅴ无码高潮片苍井空 | 18成人免费观看视频 | 男女性高潮免费网站 | 国产成人无码AA精品区 | 国产a自拍 | 激情图片在线观看 | 日韩久久精品视频 | 欧洲一区二区三区四区 | 国产精品--色哟哟 | 三上悠亚 在线观看 | 少妇一区二区视频 | 自拍日韩亚洲一区在线 | 久久精品10 | 亚洲精品手机在线 | 欧美亚洲91 | 国产美女明星三级做爰 | 国产91精品欧美 |