单表具有父级Id的菜单整合递归实现

首先有一张菜单的表,具有如下的两个字段
id,pid
一般最上层菜单的父级id为0, 如下结构

idpid
a0
b0
a1a
a2a
b1b
b2b
a11a1
b11b1

等等 这种的无限向下延伸

java中有两个类 sysMenu是数据库表的model类 Menu是自己封装的 具有list<Menu>这个属性,最终前端需要的是一个list<Menu> 用于循环展示菜单
代码如下:
首先写一个查找某个菜单的子菜单的方法,并将数据转换为Menu的这个形式

/**
 * 
 * @param id 菜单的id
 * @param menuList 数据库查询到的所有菜单列表,未整理的
 * @return 这个菜单的子菜单
 */
private List<Menu> getMenuListByPid(String id,List<SysMenu> menuList){
		List<Menu> children = new ArrayList<>();
		for (SysMenu sysMenu : menuList) {
			if(id.equals(sysMenu.getpMenuId())) {
				Menu temp= new Menu();
	            // temp 用于封装各种属性
	            children.add(temp);
			}
		}
		return children;
	}

然后再写递归算法,先把最上边一层的菜单列表查询出来,这个用于递归之后就是最终的结果了

List<Menu> menus = getMenuListByPid("0", menuList);
menus = loopSysMenu(menus,menuList);

递归函数如下:

/**
	 * 
	 * @param menus  某一级菜单的列表
	 * @param menuList 数据库查询到的所有菜单列表,未整理的
	 * @return 
	 */
	private List<Menu> loopSysMenu(List<Menu> menus, List<SysMenu> menuList) {

		for (Menu menu : menus) {
			// 循环获取某个菜单的子菜单并set到属性里边
			menu.setChildren(this.getMenuListByPid(menu.getMenuId(),menuList));
			// 如果某次返回的子菜单是空的,说明下边不在有子菜单了 所以跳出本次循环
			if(menu.getChildren().isEmpty()) {
				continue;
			}
			loopSysMenu(menu.getChildren(),menuList);
		}
		return menus;
	}

最终得到的menus就是经过许多层迭代的结果,每个menu都有children,每个children又有children,前端直接循环展示即可!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值