之前在寫管理後臺的許可權控制這一塊的時候,使用的是element的樹元件,當時還是隻做到了選單的許可權,最近才開始做按鈕的許可權,由於需求不斷,總是有新功能,所以就要不斷新增按鈕,這個時候就發現了一個問題。大概闡述一下我們的業務場景
var arr = [
{
menuId: 1,
name: "系統管理",
parentMenu: null
},
{
menuId: 2,
name: "系統管理",
parentMenu: null
},
{
menuId: 3,
name: "系統管理",
parentMenu: 1
},
{
menuId: 4,
name: "系統管理",
parentMenu: 1
}, {
menuId: 5,
name: "系統管理",
parentMenu: 2
},
{
menuId: 6,
name: "系統管理",
parentMenu: 5
},
{
menuId: 7,
name: "系統管理",
parentMenu: null
}
]
複製程式碼
類似於這種,所以由於有些父節點不在,所以不能構成相應的樹。這個時候,後臺大佬,突然來了一句,用hashmap不就行了,聽見了hashmap好像一下子明白了什麼。然後,將當前角色對應的許可權資料序列化成了一個id為key,value為children陣列的一個物件,方法非常簡單,
getNewTree(arr) {
const allParentId = {}
arr.forEach(item => {
if (item.parentId) {
let flag = false
Object.keys(allParentId).forEach(itemA => {
if (itemA == item.parentId) {
flag = true
}
})
if (flag) {
allParentId[item.parentId].push(item)
} else {
allParentId[item.parentId] = []
allParentId[item.parentId].push(item)
}
}
})
return allParentId
},
複製程式碼
得到的資料結構是這樣的
這樣,我們只需要比較當前角色的許可權資料序列化成的物件與所有許可權序列化成的物件做對比, ok,這個reapeatIds裡面就是所有新增過的子節點的父節點id了,然後我們在push初始化節點的時候過濾一下就好了。大佬如有更好的辦法,麻煩留個言。最後,,,求一份內推。。。