菜单数组转换菜单树,树形菜单构建

 

直接上代码:

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
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值