12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- function buildMenu(menu, menuList, menuIds) {
- let nextLayer = []
- for (let i = menu.length - 1; i > -1; i--) {
- const currentMenu = menu[i]
- const subMenu = menuList.filter(item => {
- if (item.parent_id === currentMenu.menu_id) {
- menuIds.push(item.menu_id)
- return true
- }
- })
- nextLayer = nextLayer.concat(subMenu)
- currentMenu.children = subMenu
- }
- if (nextLayer.length) {
- buildMenu(nextLayer, menuList, menuIds)
- }
- }
- function getParentIds(menuItem, menuList) {
- const parentArr = []
- let currentItem = menuItem
- while (currentItem && currentItem.parent_id) {
- parentArr.push(currentItem.parent_id)
- currentItem = menuList.find(item => item.menu_id === currentItem.parent_id)
- }
- return parentArr
- }
- function buildMenus(menuList, trim = true) {
- // 保证父子级顺序
- menuList = menuList.sort(function(a, b) {
- const parentIdsA = getParentIds(a, menuList)
- const parentIdsB = getParentIds(b, menuList)
- if (parentIdsA.includes(b.menu_id)) {
- return 1
- }
- return parentIdsA.length - parentIdsB.length || a.sort - b.sort
- })
- // 删除无subMenu且非子节点的菜单项
- if (trim) {
- for (let i = menuList.length - 1; i > -1; i--) {
- const currentMenu = menuList[i]
- const subMenu = menuList.filter(subMenuItem => subMenuItem.parent_id === currentMenu.menu_id)
- if (!currentMenu.isLeafNode && !subMenu.length) {
- menuList.splice(i, 1)
- }
- }
- }
- const menuIds = []
- const menu = menuList.filter(item => {
- if (!item.parent_id) {
- menuIds.push(item.menu_id)
- return true
- }
- })
- buildMenu(menu, menuList, menuIds)
- // 包含所有无效菜单
- if (!trim && menuIds.length !== menuList.length) {
- menu.push(...menuList.filter(item => !menuIds.includes(item.menu_id)))
- }
- return menu
- }
- export {
- buildMenu,
- buildMenus
- }
|