List测试数据:
转换后的数据格式:
@Data
//@ApiModel
public class Menu {
//@ApiModelProperty(value = "资源id")
private Integer id;
//@ApiModelProperty(value = "资源名称")
private String menuName;
//@ApiModelProperty(value = "资源路径")
private String urlPath;
//@ApiModelProperty(value = "父资源Id")
private Integer parent;
/** 子菜单数据 */
private List<Menu> children;
public Menu(Integer id, String menuName, String urlPath, Integer parent) {
this.id = id;
this.menuName = menuName;
this.urlPath = urlPath;
this.parent = parent;
}
}
public static void main(String[] args) {
// 测试数据
List<Menu> list = new ArrayList();
list.add(new Menu(1, "用户管理", "/user/**", 0));
list.add(new Menu(2, "新增用户", "/user/add", 1));
list.add(new Menu(3, "修改用户", "/user/update", 1));
list.add(new Menu(4, "删除用户", "/user/delete", 3));
list.add(new Menu(5, "还原用户", "/user/rem", 3));
list.add(new Menu(6, "其它管理", "/role/**", 0));
list.add(new Menu(7, "角色新增", "/role/add", 6));
list.add(new Menu(8, "角色修改", "/role/update", 6));
// 将菜单数据转为tree形格式
List<Menu> dataList = menuTreeData(list);
// 打印结果
Console.log(JSONUtil.parseArray(dataList));
// [{"parent":0,"children":[{"parent":1,"menuName":"新增用户","id":2,"urlPath":"/user/add"},{"parent":1,"children":[{"parent":3,"menuName":"删除用户","id":4,"urlPath":"/user/delete"},{"parent":3,"menuName":"还原用户","id":5,"urlPath":"/user/rem"}],"menuName":"修改用户","id":3,"urlPath":"/user/update"}],"menuName":"用户管理","id":1,"urlPath":"/user/**"},{"parent":0,"children":[{"parent":6,"menuName":"其它新增","id":7,"urlPath":"/role/add"},{"parent":6,"menuName":"其它修改","id":8,"urlPath":"/role/update"}],"menuName":"其它管理","id":6,"urlPath":"/role/**"}]
}
/**
* list数据转树形结构方法,无限制层级
* 使用该方法依赖Menu类中的id和parent两个成员变量
* @param list<Menu>
* @return
*/
public static List<Menu> menuTreeData(List<Menu> list) {
// 转parent属性相同的数据封装到一个List中
Map<Integer, List<Menu>> map = new HashMap<>();
for (Menu menu : list) {
if(!map.containsKey(menu.getParent())){
LinkedList<Menu> Menus = new LinkedList<>();
Menus.add(menu);
map.put(menu.getParent(), Menus);
}else {
List<Menu> menus = map.get(menu.getParent());
menus.add(menu);
}
}
// 获取所有父类菜单,封装最终tree结果
List<Menu> resultMenus = map.get(0);
// 递归获取所有子数值
recursionTreeChild(map, resultMenus);
return resultMenus;
}
public static void recursionTreeChild(Map<Integer, List<Menu>> map, List<Menu> resultMenus) {
for (Menu menu : resultMenus) {
// 添加子级菜单
if (map.containsKey(menu.getId())){
List<Menu> menus1 = map.get(menu.getId());
menu.setChildren(menus1);
// 递归调用
recursionTreeChild(map, menus1);
}
}
}