轉載注明出處!!!
轉載注明出處!!!
轉載注明出處!!!
因為要實現部門通訊錄,后台傳來的數據是直接從數據庫里拿的部門表,所以沒有層級分類,只有parentId表示從屬關系,所以分類的事情就交給我來做了。
不能說效率多高,只是說能實現了。
其實ACMer或者學過點算法和數據結構的應該知道這其實就是一個樹,用數組存罷了,用數組存樹的方法相信各位ACMer已經用的不要不要的了,所有並沒有什么難度,知道思路就很好寫了。
思路:獲取到后台傳來的數組dep,然后新建一個數組list,將dep遍歷一遍,獲取到每個節點的parentId,用parentId作為下標插入到list數組里面。
至此,構樹完成。
接下來就是遍歷了,我是采用遞歸遍歷的,比較簡潔,各位大神有什么更好的遍歷方法也歡迎分享。
首先獲取到根節點(也就是最頂級的那個分類)的下標,然后遍歷這個下標中的每個節點的信息,並找出這個節點的id,然后重新傳入遞歸函數即可。
下面是代碼實現,注釋依舊很清楚。相信應該能看懂,看不懂的多看幾遍,照着碼一遍應該就懂了。再不懂的,請照着程序走一遍應該就懂了。。要是....就轉行吧。

1 //無限極分類創建部門列表 2 //遞歸創建無限極分類 3 function createList(list,index) 4 { 5 //獲取當前index節點的子節點的信息 6 var tmp = list[index]; 7 var str = ''; 8 if(tmp) 9 { 10 str +='<ul style="display:none">'; 11 for(var i = 0; i < tmp.length; i++) 12 { 13 //獲取id用來遞歸 14 var id = tmp[i].id; 15 str += '<li class="block border">'; 16 str += '<div class="weui_cell" href="javascript:;"><div class="weui_cell_bd weui_cell_primary"><a id = "'+ tmp[i].id+'" href = "http://www.baidu.com">'+tmp[i].name+'</a></div><div></div></div>'; 17 //遞歸 18 str += createList(list,id); 19 str += '</li>'; 20 } 21 str += '</ul>'; 22 } 23 return str; 24 } 25 //入口函數,dep為部門的信息數組,必須有的是id和parentid 26 function createDownList(dep) 27 { 28 //初始化對象 29 var list = {}; 30 var pid = ''; 31 //循環遍歷數組,將數據放到對應的parentid下 32 for(var i = 0; i < dep.length; i++) 33 { 34 //獲取父節點下標 35 pid = dep[i].parentid; 36 //如果為定義,就定義為空數組 37 if(!list[pid]) 38 { 39 list[pid] = []; 40 } 41 //將當前節點信息加入到父元素中 42 list[pid].push(dep[i]); 43 } 44 //排序,其實沒有的話也行,我這里是為了確定某一個分類在當前兄弟分類的順序 45 for (var key in list) { 46 list[key].sort(function(a, b) { 47 return a.order > b.order ? 1 : -1; 48 }); 49 } 50 //傳入根節點(也就是最頂級分類)的下標 51 return createList(list,0); 52 }