需求:如题 前端需要展示一棵树,不管是组织结构树,还是菜单树,……。 后端提供前端所需的数据(json tree 数据由后台处理)。 实现: 分两类: 前提:List list = getAllList(); 1,在List中操作。 2,在JSONArray中操作。
1、 @Data @NoArgsConstructor @AllArgsConstructor public class Menu implements Serializable { private Integer id; private String name; private Integer pid; private List
nodes;
}
public static List
iterateMenus(List
menuVoList,Integer pid){
List
result = new ArrayList<>();
for (Menu menu:menuVoList) {
Integer menuId = menu.getId();
Integer parentId = menu.getPid();
if (!StringUtils.isEmpty(parentId)) {
if (parentId.equals(pid)) {
List
iterateMenu = iterateMenus(menuVoList,menuId);
menu.setNodes(iterateMenu);
result.add(menu);
}
}
}
return result;
}
2、
public JSONArray treeMenuList(JSONArray menuList, int parentId) {
JSONArray childMenu = new JSONArray();
for (Object object : menuList) {
JSONObject jsonMenu = (JSONObject)JSONObject.toJSON(object);
int menuId = jsonMenu.getIntValue(“id”);
int pid = jsonMenu.getIntValue(“pid”);
if (parentId == pid) {
JSONArray c_node = treeMenuList(menuList, menuId);
jsonMenu.put(“childNode”, c_node);
childMenu.add(jsonMenu);
}
}
return childMenu;
}
Test
public static void main(String[] args) {
Menu menu = new Menu(1,“home”,0,new ArrayList<>());
List
list = new ArrayList<>();
list.add(menu);
menu = new Menu(2,“firstLevel”,0,new ArrayList<>());
list.add(menu);
menu = new Menu(3,“firstLevelSon1”,2,new ArrayList<>());
list.add(menu);
menu = new Menu(4,“firstLevelSon2”,2,new ArrayList<>());
list.add(menu);
menu = new Menu(5,“secondLevel”,0,new ArrayList<>());
list.add(menu);
menu = new Menu(6,“secondLevelSon1”,5,new ArrayList<>());
list.add(menu);
List
tree = iterateMenus(list,0);
System.out.println(tree);
JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(tree));
System.out.println(jsonArray);
}
结果:
结论:
这两种都能实现,但我更推崇2。
理由:
第一种需要在bean里面加个list,破坏原有的结构。
第二种直接在JSONArray中操作。反正最终传到前端的是json数据,在数据库查出数据后,总要转一次(list to jsonarray)
最后再说一下前端插件:jquery-bootstrap-tree http://www.jq22.com/jquery-info10461