
最近在開發一個後台管理系統的權限管理模組,涉及到各種樹狀結構的資料處理邏輯,例如:增,刪,改,查等;相較於普通的數組結構數據,樹狀結構的處理就沒有數組那麼的直觀,但是也沒那麼複雜,需要多一步——遞歸查找來對數據進行深度遍歷操作,那麼這裡呢,博主也將開發過程中總結出來的方法分享給大家,一文帶你吃透JS樹裝結構資料處理:

資料結構範例
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'
}]
}];找出樹裝結構的指定節點,新增子節點,程式碼如下:
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
} 尋找樹裝結構的指定節點,刪除節點,程式碼如下
const removeNodeInTree=(treeList, id)=> { // 透過id從陣列(樹狀結構)移除元素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)
}
} 遞迴尋找並修改某個節點的狀態,程式碼如下:
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;
}
updateNodeInTree(treeList[i].children,id,obj);
}
} 遞迴尋找樹狀節點的某個節點,程式碼:
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)
}
}
}
// 所查找到的節點要儲存的方法let Obj={}
findNodeInTree(data, key, (item, index, arr) => {
Obj = item
})
// 此時就是Obj對應的要找的節點console.log(Obj)