<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近參與了一個基於 qiankun 構建的微前端大型專案,涉及到十幾個子應用,基於基座獨立開發了一個完善的許可權中心模組。而許可權中心中涉及到了 模組 > 一級選單 > N級選單/按鈕 結構的許可權管理。
這次的需求是在其中一個子應用的按鈕級別的許可權管理,在鑑權階段寫了一個小的方法,用來從許可權樹中查詢是否有某一個按鈕的許可權,從而控制使用者對於按鈕的使用許可權。
因為場景中,需求分析第一條中的原因,不能使用常見的遞迴方法,所以就結合資料建立一個可以使用遞迴解決問題的資料結構。
這次使用是使用 do-while 方法進行遞迴 findMap 模板。至於為何需要三個欄位也是因為子選單對應的鍵不一樣。當然可以改原來的資料結構,但是改起來比較麻煩,而且影響範圍太廣,所以只能這麼做了。
interface findItem { findKey: string // 目標項的key findVal: string // 目標項的value childrenKey: string // 子選單的key } // 查詢模板 const findMap = [ {findkey: 'name', findVal: "模組A", childrenKey:'functionList'}, {findkey: 'functionName', findVal: '選單1', childrenKey:'children'}, {findkey: 'functionName', findVal: '選單1-1', childrenKey:'children'}, {findkey: 'functionName', findVal: '按鈕1-1-3'} ]
接下來就是遞迴 findItem[]。
很明顯,迴圈體中的查詢方法其實有很多種,而我選擇了陣列的 filter 方法也是臨時想到的,陣列的方法中有好幾個(例如:some/include)也可以實現迴圈體的結果。
/** * 查詢是否存在 findMap 的結構資料 * @param arr getJsonV2 介面返回的許可權列表 * @param findMap findItem[] * @result boolean */ const isAccessInDataByMap = (arr, findMap) => { let findList = arr // 重置查詢範圍 let i= 0 // 初始值 let tempArr = [] // do { tempArr = findList.filter(item => item[findMap[i].findkey] === findMap[i].findVal) if(tempArr.length > 0){ findList = tempArr[0][findMap[i].childrenKey] i++ }else{ return false } } while (i< findMap.length); if(tempArr.length && i === findMap.length){ return true } }
// tool-is-has-access-in-data-by-map.ts // 宣告介面 export interface findItem { findKey: string findVal: string childrenKey: string } /** * 查詢是否存在 findMap 的結構資料 * @param arr getJsonV2 介面返回的許可權列表 * @param findMap findItem[] * @result boolean */ export const isAccessInDataByMap:(data:any, findMap:findItem[]) => boolean | undefined = (data:any, findMap:findItem[]) => { let findList = data // 重置查詢範圍 let i= 0 // 記錄下標 let tempArr = [] do { tempArr = findList.filter((item: { [x: string]: string; }) => item[findMap[i].findKey] === findMap[i].findVal) if(tempArr.length > 0){ findList = tempArr[0][findMap[i].childrenKey] i++ }else{ return false } } while (i< findMap.length); if(tempArr.length && i === findMap.length){ return true } };
這個方法記下來的原因其實並不是因為這個場景,而是因為一個解決問題的思路。
常見的樹狀結構一般來說都是每一層的資料結構都是一樣的,只有最後一層沒有子元素,這樣就可以作為跳出遞迴條件。而這個場景下雖然每一層資料結構也幾乎相同,但是每一層用來 核對 的鍵值對卻不一樣。這樣一來就需要有 一把尺子 來查詢了。
方法不難,難的是如何總結為一個通用的解決方案,完成 從 0 到 1 的過程,進而 從 1 到 n。
以上就是JS遞迴遍歷查詢是否有許可權範例詳解的詳細內容,更多關於JS遞迴遍歷查詢許可權的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45