需求:如题
前端需要展示一棵树,不管是组织结构树,还是菜单树,……。
后端提供前端所需的数据(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);
}
结果:
递归实现后台传出jsonTree数据供前端tree展示
结论:
这两种都能实现,但我更推崇2。
理由:
第一种需要在bean里面加个list,破坏原有的结构。
第二种直接在JSONArray中操作。反正最终传到前端的是json数据,在数据库查出数据后,总要转一次(list to jsonarray)

最后再说一下前端插件:jquery-bootstrap-tree
http://www.jq22.com/jquery-info10461

分类:

技术点:

相关文章: