直接上代码:
java代码:
java中对象都是以引用的方式(个人觉得跟C语言的指针类似)
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class trre
{
public static void main(String[] args)
{
String a = "[{id:1},{id:2,pid:1},{id:3,pid:2},{id:4,pid:1},{id:5,pid:1},{id:6,pid:7},{id:9}]";
System.out.println(buildTree(JSONArray.parseArray(a),"id","pid","ch"));
}
/**
* @param marr 菜单数组
* @param id 菜单ID字段
* @param pid 父菜单ID字段
* @param child 子节点字段
* @return
*/
public static JSONArray buildTree(JSONArray marr, String id, String pid,
String child)
{
JSONObject mmap = new JSONObject();
// 创建根节点
JSONArray root = new JSONArray();
// 转换为Map方便获取根节点
for (int i = 0; i < marr.size(); i++)
{
mmap.put(marr.getJSONObject(i).getString(id),
marr.getJSONObject(i));
}
for (int i = 0; i < marr.size(); i++)
{
// 1 获取父节点
JSONObject pidObj = mmap
.getJSONObject(marr.getJSONObject(i).getString(pid));
if (pidObj == null)
{ // 根节点不存在,放到自定义根节点
root.add(marr.getJSONObject(i));
}
else
{
if (!pidObj.containsKey(child))
{ // 创建孩子节点
pidObj.put(child, new JSONArray());
}
pidObj.getJSONArray(child).add(marr.getJSONObject(i));
}
}
return root;
}
}
[
{
"ch": [
{
"ch": [
{
"pid": 2,
"id": 3
}
],
"pid": 1,
"id": 2
},
{
"pid": 1,
"id": 4
},
{
"pid": 1,
"id": 5
}
],
"id": 1
},
{
"pid": 7,
"id": 6
},
{
"id": 9
}
]
不想使用JSON可以直接是用List,Map,思想跟上面是一样的,不过是添加了强转,代码不怎么好阅读
/**
* @param marr 菜单数组
* @param id 菜单ID字段
* @param pid 父菜单ID字段
* @param child 子节点字段
* @return
*/
public static List buildTree(List marr, String id, String pid,
String child)
{
Map mmap = new JSONObject();
// 创建根节点
List root = new JSONArray();
// 转换为Map方便获取根节点
for (int i = 0; i < marr.size(); i++)
{
mmap.put(((Map)marr.get(i)).get(id).toString(),marr.get(i));
}
for (int i = 0; i < marr.size(); i++)
{
Map temp = (Map)marr.get(i);
Object tpid = temp.get(pid);
// 1 获取父节点
Map pidObj = (Map)mmap.get(tpid);
if (pidObj == null)
{ // 根节点不存在,放到自定义根节点
root.add(temp);
}
else
{
if (!pidObj.containsKey(child))
{ // 创建孩子节点
pidObj.put(child, new JSONArray());
}
((List)pidObj.get(child)).add(temp);
}
}
return root;
}
同理JS的写法:
function buildTree(menuList,id,pid,child) {
var menu = [];
var temp = [];
for (var t in menuList) {
temp[menuList[t][id]] = menuList[t];
}
for (var t in menuList) {
var tpid = temp[menuList[t][pid]];
if (!tpid) {
menu.push(menuList[t])
} else {
tpid[child] = tpid[child] || [];
tpid[child].push(menuList[t])
}
}
return menu
}