一文吃透JS樹狀結(jié)構(gòu)的數(shù)據(jù)處理(增刪改查)
問題描述
JS處理樹狀結(jié)構(gòu)的增刪改查
最近在開發(fā)一個(gè)后臺(tái)管理系統(tǒng)的權(quán)限管理模塊,涉及到各種樹狀結(jié)構(gòu)的數(shù)據(jù)處理邏輯,例如:增,刪,改,查等;相比普通的數(shù)組結(jié)構(gòu)數(shù)據(jù),樹狀結(jié)構(gòu)的處理就沒有數(shù)組那么的直觀,但是也沒那么復(fù)雜,需要多一步——遞歸查找來對數(shù)據(jù)進(jìn)行深度遍歷操作,那么這里呢,博主也將開發(fā)過程中總結(jié)出來的方法分享給大家,一文帶你吃透JS樹裝結(jié)構(gòu)數(shù)據(jù)處理:
數(shù)據(jù)結(jié)構(gòu)示例
let data = [{ id: 1, label: '一級 1', children: [{ id: 4, label: '二級 1-1', children: [{ id: 9, label: '三級 1-1-1' }, { id: 10, label: '三級 1-1-2' }] }] }, { id: 2, label: '一級 2', children: [{ id: 5, label: '二級 2-1' }, { id: 6, label: '二級 2-2' }] }, { id: 3, label: '一級 3', children: [{ id: 7, label: '二級 3-1' }, { id: 8, label: '二級 3-2' }] }];
解決方案
1、新增節(jié)點(diǎn)
查找樹裝結(jié)構(gòu)的指定節(jié)點(diǎn),新增子節(jié)點(diǎn),代碼如下:
const appendNodeInTree = (id, tree, obj) => { tree.forEach(ele=> { if (ele.id === id) { ele.children ? ele.children.push(obj) : ele.children = [obj] } else { if (ele.children) { appendNodeInTree(id, ele.children, obj) } } }) return tree }
2、刪除節(jié)點(diǎn)
查找樹裝結(jié)構(gòu)的指定節(jié)點(diǎn),刪除節(jié)點(diǎn),代碼如下
const removeNodeInTree=(treeList, id)=> { // 通過id從數(shù)組(樹結(jié)構(gòu))中移除元素 if (!treeList || !treeList.length) { return } for (let i = 0; i < treeList.length; i++) { if (treeList[i].id === id) { treeList.splice(i, 1); break; } removeNodeInTree(treeList[i].children, id) } }
3、修改節(jié)點(diǎn)
遞歸查找并修改某個(gè)節(jié)點(diǎn)的狀態(tài),代碼如下:
const updateNodeInTree=(treeList,id, obj)=> { if (!treeList || !treeList.length) { return; } for (let i = 0; i < treeList.length; i++) { if (treeList[i].id == id) { treeList[i]= obj; break; } setTreeListNodeFalse(treeList[i].children,id,obj); } }
4、查找節(jié)點(diǎn)
遞歸查找樹形節(jié)點(diǎn)的某個(gè)節(jié)點(diǎn),代碼:
const findNodeInTree = (data, key, callback) => { for (let i = 0; i < data.length; i++) { if (data[i].key == key) { return callback(data[i], i, data) } if (data[i].children) { findNodeInTree (data[i].children, key, callback) } } } // 所查找到的節(jié)點(diǎn)要存儲(chǔ)的方法 let Obj={} findNodeInTree(data, key, (item, index, arr) => { Obj = item }) // 此時(shí)就是Obj對應(yīng)的要查找的節(jié)點(diǎn) console.log(Obj)
總結(jié)
本文介紹了js如何處理樹裝數(shù)據(jù)結(jié)構(gòu)的增刪改查,掌握以上函數(shù),基本可以應(yīng)對同樣業(yè)務(wù)類型的數(shù)據(jù)處理
以上就是一文吃透JS樹狀結(jié)構(gòu)的數(shù)據(jù)處理(增刪改查)的詳細(xì)內(nèi)容,更多關(guān)于JS樹狀結(jié)構(gòu)的數(shù)據(jù)處理的資料請關(guān)注腳本之家其它相關(guān)文章
相關(guān)文章
Chart.js 輕量級HTML5圖表繪制工具庫(知識(shí)整理)
這篇文章主要介紹了Chart.js 輕量級HTML5圖表繪制工具庫,Chart.js基于HTML5 canvas技術(shù)支持所有現(xiàn)代瀏覽器,并且針對IE7/8提供了降級替代方案,感興趣的小伙伴們可以參考一下2018-05-05JavaScript+Canvas實(shí)現(xiàn)彩色圖片轉(zhuǎn)換成黑白圖片的方法分析
這篇文章主要介紹了JavaScript+Canvas實(shí)現(xiàn)彩色圖片轉(zhuǎn)換成黑白圖片的方法,結(jié)合實(shí)例形式分析了javascript結(jié)合HTML5相關(guān)函數(shù)修改頁面圖片元素顯示效果相關(guān)操作技巧,需要的朋友可以參考下2018-07-07MVVM模式中ViewModel和View、Model有什么區(qū)別?
這篇文章主要介紹了MVVM模式中ViewModel和View、Model有什么區(qū)別?本文分別解釋了它們的功能和作用,然后總結(jié)了它之間的區(qū)別,需要的朋友可以參考下2015-06-06JavaScript算法實(shí)例之求二叉樹從根到葉的所有路徑和
如果你希望求某一特定路徑(例如從根到葉子)上數(shù)字的和,那么問題就轉(zhuǎn)變?yōu)榱恕扒蠖鏄鋸母饺~的所有路徑和”,所以本文給大家介紹了如何使用JavaScript求二叉樹從根到葉的所有路徑和,需要的朋友可以參考下2023-10-10webpack-mvc 傳統(tǒng)多頁面組件化開發(fā)詳解
這篇文章主要介紹了webpack-mvc 傳統(tǒng)多頁面組件化開發(fā)詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05實(shí)現(xiàn)png圖片和png背景透明(支持多瀏覽器)的方法
Firefox和Opera對PNG的支持非常的好,都是IE卻無視PNG圖片這一特性的“存在”,雖然IE7已經(jīng)支持都是IE6還是不行。2009-09-09console.log()與console.dir()的區(qū)別及說明
這篇文章主要介紹了console.log()與console.dir()的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01