成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

javascript將扁平的數據轉為樹形結構的高效率算法

瀏覽:165日期:2023-11-09 15:23:13

當我們需要將一個一維數組轉換成一個多層結構的時候,最簡單但是最慢的就是多個for循環嵌套,但是這樣做有一些缺點,那就是效率太低、而且有多少層就需要嵌套幾個for循環,不好用。

我實現了用O(n)級算法將 一個扁平的數組即一維數組代表的菜單結構轉換成一個多層級的菜單結構。

一位數組中每一個元素必須要包含以下屬性:

擁有一個唯一的id 擁有一個parent_id, 這個id指向它父級的id

其他則為每一個元素中的一些信息,我這里是菜單,就有菜單的名稱和url信息。

注:

在層級結構中,第一層的parent_id需要為0. 父節點在數組中的位置需要在子節點前,即 節點3必須排在節點3-2之前

扁平數組例:

var menu_list = [{ id: ’1’, menu_name: ’設置’, menu_url: ’setting’, parent_id: 0 }, { id: ’1-1’, menu_name: ’權限設置’, menu_url: ’setting.permission’, parent_id: ’1’ }, { id: ’1-1-1’, menu_name: ’用戶管理列表’, menu_url: ’setting.permission.user_list’, parent_id: ’1-1’ }, { id: ’1-1-2’, menu_name: ’用戶管理新增’, menu_url: ’setting.permission.user_add’, parent_id: ’1-1’ }, { id: ’1-1-3’, menu_name: ’角色管理列表’, menu_url: ’setting.permission.role_list’, parent_id: ’1-1’ }, { id: ’1-2’, menu_name: ’菜單設置’, menu_url: ’setting.menu’, parent_id: ’1’ }, { id: ’1-2-1’, menu_name: ’菜單列表’, menu_url: ’setting.menu.menu_list’, parent_id: ’1-2’ }, { id: ’1-2-2’, menu_name: ’菜單添加’, menu_url: ’setting.menu.menu_add’, parent_id: ’1-2’ }, { id: ’2’, menu_name: ’訂單’, menu_url: ’order’, parent_id: 0 }, { id: ’2-1’, menu_name: ’報單審核’, menu_url: ’order.orderreview’, parent_id: ’2’ }, { id: ’2-2’, menu_name: ’退款管理’, menu_url: ’order.refundmanagement’, parent_id: ’2’ }]

實現算法buildTree

算法思想:

先將數組中的每一個節點放到temp對象中(創建set)即數組中有{id: ’2-3’, parent_id: ’2’,...}這樣一個節點,需要將他放到temp中變成 ’2-3’: {id: ’2-3’, parent_id: ’2’,...}這種JSON結構

直接遍歷整個temp對象,通過這句代碼 temp[temp[i].parent_id].children[temp[i].id] = temp[i]; 將當前子節點與父節點建立連接。是因為我們保證了父節點一定在子節點前,那么當子節點出現的時候就直接可以用temp[temp[i].parent_id]來查找到父節點這個時候先父節點的children對象中添加一個引用即可。

/** * 將一維的扁平數組轉換為多層級對象 * @param {[type]} list 一維數組,數組中每一個元素需包含id和parent_id兩個屬性 * @return {[type]} tree 多層級樹狀結構 */function buildTree(list){let temp = {};let tree = {};for(let i in list){temp[list[i].id] = list[i];}for(let i in temp){if(temp[i].parent_id) {if(!temp[temp[i].parent_id].children) {temp[temp[i].parent_id].children = new Object();}temp[temp[i].parent_id].children[temp[i].id] = temp[i];} else {tree[temp[i].id] = temp[i];}}return tree;}

測試結果:

可以看到函數成功地構建了多級的樹狀結構

javascript將扁平的數據轉為樹形結構的高效率算法

這個算法的效率是極高的,比多重for循環來的好得多。

以下是測試數據,用時只需5毫秒左右:

var menu_list = [{ id: ’1’, menu_name: ’設置’, menu_url: ’setting’, parent_id: 0 }, { id: ’1-1’, menu_name: ’權限設置’, menu_url: ’setting.permission’, parent_id: ’1’ }, { id: ’1-1-1’, menu_name: ’用戶管理列表’, menu_url: ’setting.permission.user_list’, parent_id: ’1-1’ }, { id: ’1-1-2’, menu_name: ’用戶管理新增’, menu_url: ’setting.permission.user_add’, parent_id: ’1-1’ }, { id: ’1-1-3’, menu_name: ’角色管理列表’, menu_url: ’setting.permission.role_list’, parent_id: ’1-1’ }, { id: ’1-1-4’, menu_name: ’角色管理新增’, menu_url: ’setting.permission.role_add’, parent_id: ’1-1’ }, { id: ’1-2’, menu_name: ’菜單設置’, menu_url: ’setting.menu’, parent_id: ’1’ }, { id: ’1-2-1’, menu_name: ’菜單列表’, menu_url: ’setting.menu.menu_list’, parent_id: ’1-2’ }, { id: ’1-2-2’, menu_name: ’菜單添加’, menu_url: ’setting.menu.menu_add’, parent_id: ’1-2’ }, { id: ’2’, menu_name: ’訂單’, menu_url: ’order’, parent_id: 0 }, { id: ’2-1’, menu_name: ’報單審核’, menu_url: ’order.orderreview’, parent_id: ’2’ }, { id: ’2-2’, menu_name: ’退款管理’, menu_url: ’order.refundmanagement’, parent_id: ’2’ }, { id: ’2-3’, menu_name: ’實物訂單’, menu_url: ’order.realorder’, parent_id: ’2’ }, { id: ’2-1-1’, menu_name: ’全部報單’, menu_url: ’order.orderreview.all’, parent_id: ’2-1’ }, { id: ’2-2-1’, menu_name: ’所有記錄’, menu_url: ’order.refundmanagement.all’, parent_id: ’2-2’ }, { id: ’2-2-2’, menu_name: ’待處理’, menu_url: ’order.refundmanagement.wait’, parent_id: ’2-2’ }, { id: ’2-2-3’, menu_name: ’退款原因’, menu_url: ’order.refundmanagement.result’, parent_id: ’2-2’ }, { id: ’2-3-1’, menu_name: ’實物訂單管理’, menu_url: ’order.realorder.list’, parent_id: ’2-3’ }, { id: ’3’, menu_name: ’商品’, menu_url: ’commodity’, parent_id: 0 }, { id: ’3-1’, menu_name: ’分類管理’, menu_url: ’commodity.classifieldmanagement’, parent_id: ’3’ }, { id: ’3-1-1’, menu_name: ’管理’, menu_url: ’commodity.classifieldmanagement.management’, parent_id: ’3-1’ }, { id: ’3-1-2’, menu_name: ’編輯或新增’, menu_url: ’commodity.classifieldmanagement.edit’, parent_id: ’3-1’ }, { id: ’3-2’, menu_name: ’品牌管理’, menu_url: ’commodity.brandmanagement’, parent_id: ’3’ }, { id: ’3-2-1’, menu_name: ’管理’, menu_url: ’commodity.brandmanagement.management’, parent_id: ’3-2’ }, { id: ’3-2-2’, menu_name: ’編輯或新增’, menu_url: ’commodity.brandmanagement.edit’, parent_id: ’3-2’ }, { id: ’3-3’, menu_name: ’商品管理’, menu_url: ’commodity.commoditymanagement’, parent_id: ’3’ }, { id: ’3-3-1’, menu_name: ’管理’, menu_url: ’commodity.commoditymanagement.management’, parent_id: ’3-3’ }, { id: ’3-3-2’, menu_name: ’編輯或新增’, menu_url: ’commodity.commoditymanagement.edit’, parent_id: ’3-3’ }, { id: ’3-4’, menu_name: ’類型管理’, menu_url: ’commodity.typeManagement’, parent_id: ’3’ }, { id: ’3-4-1’, menu_name: ’管理’, menu_url: ’commodity.typeManagement.management’, parent_id: ’3-4’ }, { id: ’3-4-2’, menu_name: ’編輯或新增’, menu_url: ’commodity.typeManagement.edit’, parent_id: ’3-4’ }];

這是我一個大二學生想出來的,挺開心的,因為當時看到老師用的3個for循環嵌套。嘿嘿嘿

到此這篇關于javascript將扁平的數據轉為樹形結構的高效率算法的文章就介紹到這了,更多相關javascript 扁平數據轉為樹形結構內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久人人爽人人爽| 极品av少妇一区二区| 黄色亚洲免费| 久久久精品黄色| 成人av第一页| 日韩女优av电影在线观看| 国产在线一区二区| 3751色影院一区二区三区| 麻豆成人在线观看| 欧美自拍偷拍一区| 亚洲成人先锋电影| 午夜宅男久久久| 亚洲成人动漫av| 久久最新视频| 日本人妖一区二区| 日本高清不卡一区| 精品中文字幕一区二区小辣椒| 色8久久人人97超碰香蕉987| 男女视频一区二区| 日本韩国视频一区二区| 久久99热99| 91精品啪在线观看国产60岁| 福利一区二区在线| 久久午夜羞羞影院免费观看| 欧美日韩国产综合在线| 国产精品人人做人人爽人人添 | 亚洲视频免费看| 亚洲人体偷拍| 亚洲国产日日夜夜| 一本大道av一区二区在线播放| 免费成人美女在线观看.| 欧美精品在欧美一区二区少妇| 国产不卡视频一区| 精品剧情在线观看| 国产精品成人一区二区网站软件 | 国产91精品一区二区| 精品福利二区三区| 91视频免费播放| 亚洲丝袜美腿综合| 美女成人午夜| 精品一区中文字幕| 26uuu精品一区二区三区四区在线| 欧美午夜久久| 亚洲成人免费在线| 欧美色国产精品| 99久久伊人久久99| 亚洲欧洲精品一区二区三区不卡| 亚洲在线成人| 精品一区二区久久| 久久久久国产免费免费| 一区二区三区精品国产| 美日韩一区二区| 日韩欧美高清在线| 欧美午夜一区| 午夜久久久影院| 91精品欧美综合在线观看最新| 91麻豆免费看| 亚洲国产精品尤物yw在线观看| 欧美亚洲动漫另类| av电影在线观看一区| 一区二区在线看| 欧美老年两性高潮| 欧美激情第10页| 亚洲国产精品久久不卡毛片| 欧美喷潮久久久xxxxx| 亚洲欧美在线网| 日韩影院在线观看| 日韩色视频在线观看| 狠狠干综合网| 美女在线观看视频一区二区| 久久先锋影音av鲁色资源| 国产精品一区二区在线观看| 国内外成人在线| 国产女人18毛片水真多成人如厕| 久久精品国产99精品国产亚洲性色| 国产成人亚洲综合a∨婷婷| 国产精品区一区二区三| 在线精品视频免费播放| 欧美jjzz| 久久国产精品99久久久久久老狼| 国产欧美日韩在线观看| 狂野欧美一区| 91麻豆自制传媒国产之光| 日韩二区三区在线观看| 久久久久久久久99精品| 色哟哟国产精品| 99r国产精品| 日韩高清在线一区| 国产日韩精品一区二区浪潮av| 久久综合电影| 欧美尤物一区| 麻豆高清免费国产一区| 亚洲欧洲成人自拍| 日韩三级免费观看| 久久一二三区| 伊人成年综合电影网| 国产成人综合在线| 一区二区三区高清不卡| 2021国产精品久久精品| 在线观看中文字幕不卡| 国产一区二区三区无遮挡| 国产一区二区三区免费观看| 亚洲最快最全在线视频| 久久久久国产精品厨房| 欧美精品精品一区| 久久精品道一区二区三区| 精品福利av| 成人av免费在线观看| 七七婷婷婷婷精品国产| 亚洲欧洲中文日韩久久av乱码| 精品国产露脸精彩对白| 欧美日韩你懂得| 国产欧美亚洲一区| 色综合一区二区三区| 久久99深爱久久99精品| 亚洲成人综合在线| 国产精品久久久久久久第一福利| 欧美一卡二卡在线观看| 色综合久久久久久久| 日韩一级大片| 午夜精品久久| 成人av免费网站| 精品伊人久久久久7777人| 亚洲第一电影网| 亚洲视频在线一区二区| 欧美一区二区三区成人| 91国产福利在线| 国产一区二区三区久久| 亚洲五月婷婷| 欧美1区视频| 成人一区在线看| 国产毛片精品国产一区二区三区| 奇米在线7777在线精品| 性久久久久久久| 亚洲综合999| 中文字幕在线不卡视频| 久久精品亚洲乱码伦伦中文 | 日一区二区三区| 中文字幕一区二区三| 久久美女高清视频| 欧美一级艳片视频免费观看| 欧美性生活影院| 久久综合福利| 免费亚洲网站| 亚洲尤物精选| 男人的天堂亚洲在线| 亚洲经典在线看| 亚洲二区精品| 亚洲黄网站黄| 激情五月***国产精品| 欧美色一级片| 国产精品播放| 激情亚洲成人| 亚洲国产日韩美| 亚洲高清在线播放| 在线看片一区| 国内精品久久久久国产盗摄免费观看完整版 | 中文亚洲欧美| 在线欧美福利| 亚洲成人中文| 亚洲免费观看| 国产区日韩欧美| 国产偷久久久精品专区| 99爱精品视频| 亚洲深夜激情| 亚洲在线视频| 色综合久久久久久久| 久久精品五月| 老牛影视一区二区三区| 久久伊人亚洲| 91传媒视频在线播放| 日本韩国欧美一区二区三区| 色诱亚洲精品久久久久久| 色婷婷亚洲一区二区三区| 色八戒一区二区三区| 欧美三级中文字| 91国产免费观看| 欧美精品九九99久久| 欧美一区二区三区在线| 欧美一区二区三区四区在线观看| 91精品国产综合久久小美女| 日韩你懂的电影在线观看| 日韩欧美二区三区| 国产亚洲欧美激情| 国产精品久久久久aaaa樱花| 成人免费视频在线观看| 亚洲一区在线观看视频| 午夜精品免费在线观看| 蜜臀久久久久久久| 国产在线日韩欧美| 不卡的电视剧免费网站有什么| 91丨porny丨户外露出| 欧美婷婷久久| 中文有码久久| 色呦呦国产精品| 4hu四虎永久在线影院成人| 精品国产91久久久久久久妲己| 久久久夜色精品亚洲| 国产精品成人免费精品自在线观看| 亚洲黄色录像片|