1.判断是否是数组 //判断是否是数组 function isArray(o){ return Object.prototype.toString.call(o)== '[object Array]'; }
2.定义一个排序函数 //定义一个排序函数 function compare(pro='id',order='asc' ) { return function (obj1, obj2) { let val1 = obj1[pro]; let val2 = obj2[pro]; if(order=== 'desc'){ val1 =obj2[pro]; val2 = obj1[pro]; } if (val2 < val1 ) { //正序 return 1; } else if (val2 > val1 ) { return -1; } else { return 0; } } }
3.根据指定的list 和字段生成多级树
//list转化为tree /** * 将list装换成tree * @param {Object} myId 数据主键id * @param {Object} pId 数据关联的父级id * @param {Object} list list集合 */
function listToTree(list, myId='id',pId='parentId',pro='order',order='asc'){ if(!isArray(list)){ return ; } function exists(list, parentId){ for(var i=0; i<list.length; i++){ if (list[i][myId] == parentId) return true; } return false; } let sort = compare( pro,order); var nodes = []; // get the top level nodes for(var i=0; i<list.length; i++){ var row = list[i]; if (!exists(list, row[pId])){ nodes.push(row); } } nodes = nodes.sort(sort); var toDo = []; for(var i=0; i<nodes.length; i++){ toDo.push(nodes[i]); } toDo = toDo.sort(sort); while(toDo.length){ var node = toDo.shift(); // the parent node // get the children nodes for(var i=0; i<list.length; i++){ var row = list[i]; if (row[pId] == node[myId]){ //var child = {id:row.id,text:row.name}; if (node.children){ node.children.push(row); } else { node.children = [row]; } toDo.push(row); } if(i == list.length-1 && isArray(node.children)){ node.children = node.children.sort(sort); } } } return nodes; }