国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

JS中樹的查找:通過子節點ID查找所有關聯的父節點

開發 前端
樹是JS中非常常見的數據結構。知識庫目錄,側邊欄菜單,字典目錄,企業組織架構等都可能會用到樹的操作。

提示:底部有完整的源碼,童鞋們有需要可以CTRL + C拿走,但我建議你能真正理解實現原理,而不是直接CTRL + C。

樹是JS中非常常見的數據結構。知識庫目錄,側邊欄菜單,字典目錄,企業組織架構等都可能會用到樹的操作。

不知道大家有沒有使用過element-ui等組件庫中的級聯選擇器?它所接收的數據類型就是樹形結構的數組。級聯選擇器的綁定值是被選中的一系列父子節點id構成的數組,而后端通常僅需要我們提供最后一個葉子節點的id;然而,在編輯的時候,我們僅提供最后一個葉子節點的id是無法還原級聯選擇器選項的選中狀態的;所以,我們需要通過該節點id將與其關聯的父節點全部查找出來,得到一個與級聯選擇器適配的數據。

現在,我們實現根據節點id查找關聯的父節點函數getTreeIds。我們先定義一個空函數,該函數需要接收3個參數:樹形結構數組tree,節點id,節點信息配置config。config用于配置id和children字段,因為這是一個通用函數,我們需要應對后端開發者使用的children和id字段可能存在的不統一問題。

export const getTreeIds = (tree, nodeId, config) => {}

下面的所有代碼全部寫在getTreeIds函數體內。現在,我們從config中拿到children和id字段,并分別設置一個默認值。

const { children = 'children', id = 'id' } = config || {}

假設我們的數據結構是下面這樣的,該如何通過子節點查找父節點呢?我們都知道,父子節點的關聯是通過children字段建立的。可惜這個關聯是單向的,我們只能通過父節點查找子節點,而不能通過子節點查找父節點,因為我們的子節點缺少對父節點的引用。

[
{
id: 1,
label: 'test1',
children: [
{
id: 2,
label: 'test1-1',
children: [ { id: 3, label: 'test1-1-1' }]
}
]
}
]

我們需要編寫一個函數手動將子節點與父節點建立綁定。最簡單的查找方式就是將樹形結構轉化為扁平化數組,并建立關聯,然后再進行查找。

toFlatArray函數的源碼如下,我們使用數組的reduce方法對樹形結構數組進行聚合遞歸轉化為扁平化的樹,將parentId字段添加到子節點,這樣我們就建立了子節點到父節點的關聯。

const toFlatArray = (tree, parentId) => {
return tree.reduce((t, _) => {
const child = _[children]
return [
...t,
parentId ? { ..._, parentId } : _,
...(child && child.length ? toFlatArray(child, _[id]) : [])]
}, [])
}

然后,我們創建getIds函數,該函數接收一個扁平化的樹,使用while循環進行查找,如果存在parentId,我們就把它添加到ids數組的開頭,一直查找到樹的根部。最后,我們返回ids數組。

const getIds = flatArray => {
let ids = [nodeId]
let child = flatArray.find(_ => _[id] === nodeId)
while (child && child.parentId) {
ids = [child.parentId, ...ids]
child = flatArray.find(_ => _[id] === child.parentId)
}
return ids
}

最后,我們在getTreeIds函數體的尾部,將標準樹轉化為扁平化的樹后傳遞給getIds函數返回的ids數組返回。

return getIds(toFlatArray(tree))

現在,我們大功告成了。我們可以用一些假數據測試一下:

const treeData = [
{
id: 1,
label: 'test1',
children: [
{
id: 2,
label: 'test1-1',
children: [
{
id: 3,
label: 'test1-1-1'
},
{
id: 4,
label: 'test1-1-2',
children: [
{
id: 5,
label: 'test1-1-1-1'
}
]
}
]
}
]
}
]
console.log(getTreeIds(treeData, 5)) // 輸出 [1, 2, 4, 5]
console.log(getTreeIds(treeData, 3)) // 輸出 [1, 2, 3]

童鞋們,學會了嗎?是不是很簡單?

責任編輯:姜華 來源: 今日頭條
相關推薦

2011-08-18 13:31:44

SQL Server數子節點查詢所有父節點

2023-06-16 07:48:51

DOM對象JS

2014-11-17 09:51:39

PHP

2023-11-03 08:08:00

MySQL子節點

2023-02-13 11:26:03

符號鏈接Linux

2023-07-18 07:19:59

2024-10-24 10:16:36

2023-01-30 14:27:14

Linux進程

2022-04-15 10:37:00

權限進程UAC

2020-12-22 08:56:51

JavaScript數據結構前端

2021-09-03 08:58:00

二叉搜索樹節點

2023-01-28 08:24:28

MySQL索引B+樹

2022-12-26 00:51:33

雙向鏈表二叉搜索樹

2022-05-10 07:20:18

Linux系統密碼

2017-10-10 16:59:28

Java數據結構算法解析

2009-11-06 14:51:14

WCF配置子節點

2020-11-04 09:46:40

Volodya漏洞惡意軟件

2012-04-09 16:22:43

C#

2023-05-08 15:57:16

二叉樹數據結構

2010-09-08 15:13:09

Node節點Node屬性
點贊
收藏

51CTO技術棧公眾號

99久久久精品免费观看国产蜜| av一本在线| 成人在线观看免费| 亚洲美女在线国产| 亚洲日本精品国产第一区| 欧美18一12sex性处hd| 精品一区二区三区的国产在线播放| 欧美三级电影在线看| 熟妇人妻无乱码中文字幕真矢织江| 国产不卡一二三区| 一区二区三区免费| 国内精品视频在线播放| 日韩最新av| 欧美精品一区二区三区蜜臀| 国产超碰91| 亚洲成人短视频| 国产精品伦理一区二区| 日本最新高清不卡中文字幕| 成a人片在线观看www视频| 久久精品国产精品亚洲红杏| av在线播放av| 天天综合天天做天天综合| 无码人妻精品一区二区三区66| 男女男精品视频网| 国产乱码一区| 天堂蜜桃91精品| 国产精品一区久久| 国产一区二区亚洲| 国产精品普通话| 麻豆免费在线视频| 国产婷婷色一区二区三区 | a级片免费在线观看| 日韩高清在线观看| 久久免费国产视频| 秋霞毛片久久久久久久久| freemovies性欧美| 日日噜噜夜夜狠狠视频欧美人| 26uuu日韩精品一区二区| 伦理一区二区| 国产精品女视频| 亚洲一区二区三区免费在线观看| 亚洲欧洲另类精品久久综合| 国产精品一区二区久久不卡| 日韩精品一区二区三区色欲av| 国产精品天干天干在线综合| wwwav91| 精品美女久久久久久免费| 欧美v亚洲v| 91av在线免费观看| 美女视频免费一区| 久久午夜夜伦鲁鲁一区二区| 91久久国产最好的精华液| 国产日韩一区二区三免费高清| 日本久久91av| jiyouzz国产精品久久| 国产麻豆综合| 国产精品视频自在线| 亚洲精品日韩一| 中文字幕97| 亚洲激情视频在线播放| 精品美女在线视频| 亚洲小说欧美另类激情| 成人精品免费看| 天堂影院在线| www.亚洲免费视频| 肉色丝袜一区二区| 国内av免费| 精品人在线二区三区| 伊人久久大香线蕉综合影院首页| 欧美精品日韩三级| **国产精品| 久久人人爽人人| 丁香另类激情小说| 春暖花开成人亚洲区| 国产精品久久激情| 亚洲日本在线观看| 色爱av综合网| 嫩草影院2018| 国产免费一区二区三区在线能观看 | 国产手机精品在线| 波多野结衣在线aⅴ中文字幕不卡| 性xxxfreexxxx性欧美| 免费在线观看视频a| 国产欧美日韩中文字幕| 一本一本久久a久久精品综合麻豆| 免费在线国产| 久久久久久久久久久一区 | 免费日韩av片| 日韩国产欧美精品| 人人狠狠综合久久亚洲婷| 欧美亚洲国产日本| 色婷婷热久久| 国产欧美日韩丝袜精品一区| 亚洲精品韩国| 在线观看免费成人av| 亚洲另类图片色| 成人性生交大合| 91在线看www| 亚洲精品国产视频| 人人超碰91尤物精品国产| 日韩高清一级| 国产中文在线视频| 免费人成自慰网站| 九色综合日本| 久久免费视频网站| 欧美一区二区人人喊爽| 中文字幕精品—区二区四季| 国产精品成人自拍| 99爱免费视频| 3d欧美精品动漫xxxx无尽| 久久99国产精品99久久| 4438x亚洲最大成人网| 免费在线成人| av高清一区| 午夜宅男在线视频| 亚洲xxxx18| 一区二区三区在线观看视频| 日本久久一区| www精品久久| 国产午夜福利100集发布| 91在线视频| 日韩一区二区在线观看| 不卡福利视频| 日本中文字幕网址| 91久久国产综合久久蜜月精品| 欧美人成网站| 呦呦在线视频| 小水嫩精品福利视频导航| 九九视频精品在线观看| 国产精品自拍合集| 日韩欧美亚洲在线| 99精品国产一区二区| 久久男人av资源网站| 一本一本久久a久久精品牛牛影视| 欧美日韩久久一区| 不卡欧美aaaaa| 欧美一区91| 国产一区二区三区免费观看在线 | 精品国产乱码久久久久软件| 亚洲精品理论电影| 久久伊99综合婷婷久久伊| 色999久久久精品人人澡69| 久久撸在线视频| 日本成熟性欧美| 亚洲国产高潮在线观看| 精品少妇一区二区三区视频免付费 | 黄色一区二区在线观看| 国产福利一区二区| 丝袜美腿美女被狂躁在线观看 | 蜜桃在线一区| 久久人体av| 中国丰满熟妇xxxx性| 91成人综合网| 免费看黄色一级大片| 亚洲一级免费在线观看| 婷婷六月天丁香| 性感av在线播放| 在线免费av观看| 日本www在线播放| 欧美极品色图| 亚洲qvod图片区电影| 91高清免费视频| 2019中文在线观看| 国产精品网红直播| 最近2019中文字幕mv免费看| 91精品国产综合久久香蕉麻豆| proumb性欧美在线观看| 日产国产高清一区二区三区| 俺要去色综合狠狠| 中文字幕一区二区三区欧美日韩| 鲁大师成人一区二区三区 | 色影院视频在线| 成人免费影院| japanese在线视频| 91精品免费| 日本一二三区视频在线| av免费观看国产| 头脑特工队2免费完整版在线观看| 先锋影音在线资源站91| 五月天色综合| 石原莉奈在线亚洲二区| 99在线精品视频| 亚洲午夜精品久久久久久久久| 亚洲精品xxxx| 精品国产乱码久久| 亚洲成人精品在线| 日韩精品丝袜在线| 亚洲人成伊人成综合网久久久| 中文字幕免费国产精品| 国产精品男人的天堂| 91精品久久久久久久久青青| 国产自摸综合网| 亚洲一区二区三区四区视频| 99re国产视频| 欧美视频1区| 久久国产精品免费观看| 日本亚洲一区| 日韩欧国产精品一区综合无码| h视频在线播放| 国产高清免费av在线|