樹形菜單的json字符串的拼接


最近在學習權限管理, 要用到樹形按鈕, 但是字符串的拼接是一個難理解的問題, 然后從網上找了一個從前台用js來遍歷組成這個json字符串, 很好! 但是沒看懂...

    var data = [
        {"id":1,"parendId":0,"name":"Foods"},
        {"id":2,"parentId":1,"name":"Fruits"},
        {"id":3,"parentId":1,"name":"Vegetables"},
        {"id":4,"parentId":2,"name":"apple"},
        {"id":5,"parentId":2,"name":"orange"},
        {"id":6,"parentId":3,"name":"tomato"},
        {"id":7,"parentId":3,"name":"carrot"},
        {"id":8,"parentId":3,"name":"cabbage"},
        {"id":9,"parentId":3,"name":"potato"},
        {"id":10,"parentId":3,"name":"lettuce"}
    ];


    function exists(rows, parentId){
        for(var i=0; i<rows.length; i++){
            if (rows[i].id == parentId) {
                return true;
            }
        }
        return false;
    }

    function convert(rows){
        var nodes = [];
        //取到第一級菜單
        for(var i=0; i<rows.length; i++){
            var row = rows[i];
            if (!exists(rows, row.parentId)){
                nodes.push({
                    id:row.id,
                    text:row.name
                });
            }
        }

        var toDo = [];
        for(var i=0; i<nodes.length; i++){
            toDo.push(nodes[i]);
        }
        while(toDo.length){
            var node = toDo.shift();    // the parent node
            //取得子菜單
            for(var i=0; i<rows.length; i++){
                var row = rows[i];
                if (row.parentId == node.id){
                    var child = {id:row.id,text:row.name};
                    if (node.children){
                        node.children.push(child);
                    } else {
                        node.children = [child];
                    }
                    toDo.push(child);
                }
            }
        }
        return nodes;
    }

    var data1 = convert(data);

    $('#tt').tree({
        data:data1
    });

 

下面是從后台拼接字符串

貼在這里從后台實現的方法不是一種可取的辦法, 是利用多次從數據庫取出數據進行拼接, 最后也能實現效果, 只是這個數據量太小了, 如果是企業里比較大型的項目, 這樣會占用不少電腦的性能, 從網上找的那些基本沒看懂

import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList;
import java.sql.Connection;
/** * @author 25673 * @數據庫連接類 */ public class ConnectionUtil { public static Connection getConnection() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); //"jdbc:mysql://數據庫地址:3306/數據庫名","用戶名","用戶密碼" conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/quanxian","root",""); } catch (Exception e) { e.printStackTrace(); } return conn; } public static ArrayList<Menu> findMenu(String parentid) { String sql = "select * from sys_menu where parent_id = '"+parentid+"'"; Connection c = null; Statement s = null; ResultSet r = null; ArrayList<Menu> arrList = null; c = getConnection(); try { s = c.createStatement(); r = s.executeQuery(sql); arrList = new ArrayList<Menu>(); while(r.next()) { Menu menu = new Menu(); menu.setId(r.getString("id")); menu.setParentid(r.getString("parent_id")); menu.setMenuName(r.getString("menu_name")); arrList.add(menu); } } catch (Exception e) { e.printStackTrace(); } finally { try { c.close(); s.close(); r.close(); } catch (Exception e) { e.printStackTrace(); } } return arrList; } /** * @param arrList 查詢出來的所有符合條件的結果 * @param parentid 第一級菜單的parentid * @return */ public static String strJson(String parentid) { /* 每調用一次這個方法, 就要去連接一次數據庫, 總覺這樣會增加很多工作量, 因為是進行了多次查詢
這里使用了遞歸的方式
*/ ArrayList<Menu> arrList = findMenu(parentid); StringBuilder sb = new StringBuilder(); for(int n = 0;n < arrList.size();n++) { sb.append("{"); sb.append("\"id\":\""+arrList.get(n).getId()+"\","); sb.append("\"text\":\""+arrList.get(n).getMenuName()+"\""); String str = strJson(arrList.get(n).getId()); if(!str.equals("")) { sb.append(",\"state\":\"closed\""); sb.append(",\"children\":["+str+"]"); } sb.append("}"); if(n < (arrList.size() - 1)) { sb.append(","); } } return sb.toString(); } }

還在繼續思考怎么從后台一次性查出所有的信息, 直接用拼接的方式組成這個字符串, 希望能有人指點一下, 謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM