方法一(经测试,平均执行时间在0.67ms左右):
代码:
// 格式化数据,建立多叉树
function ConvertToTreeGridJson(rows, idFieldName, pidFieldName, fileds) {
function exists(rows, ParentId) {
for (var i = 0; i < rows.length; i++) {
if (rows[i][idFieldName] == ParentId)
return true;
}
return false;
}
var nodes = [];
// get the top level nodes
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
if (!exists(rows, row[pidFieldName])) {
var data = {
id: row[idFieldName]
}
var arrFiled = fileds.split(",");
for (var j = 0; j < arrFiled.length; j++)
{
if (arrFiled[j] != idFieldName)
data[arrFiled[j]] = row[arrFiled[j]];
}
nodes.push(data);
}
}
//console.log("根目录nodes:"+JSON.stringify(nodes));
var toDo = [];
for (var i = 0; i < nodes.length; i++) {
toDo.push(nodes[i]);
}
while (toDo.length) {
var node = toDo.shift(); // the parent node
// get the children nodes
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
if (row[pidFieldName] == node.id) {
var child = {
id: row[idFieldName]
};
var arrFiled = fileds.split(",");
for (var j = 0; j < arrFiled.length; j++) {
if (arrFiled[j] != idFieldName) {
child[arrFiled[j]] = row[arrFiled[j]];
}
}
if (node.children) {
node.children.push(child);
} else {
node.children = [child];
}
toDo.push(child);
}
}
}
return nodes;
};
用法:
var department_comboxtree = ConvertToTreeGridJson(data, "id", "_parentId", "id,_parentId,text,menu_url,iconCls");
方法二(经测试,平均执行时间在0.55ms左右,抛开其他未知性能,从执行时间上来讲,推荐此方法):
代码:
// 把线性数据转成树形数据
function setTreeData(data,idFieldName,pidFieldName, childname){
let cloneData = JSON.parse(JSON.stringify(data))// 对源数据深度克隆
let tree = cloneData.filter((father)=>{//循环所有项
let branchArr = cloneData.filter((child)=>{
return father[idFieldName] == child[pidFieldName]//返回每一项的子级数组
});
if(branchArr.length>0){
father[childname] = branchArr;//如果存在子级,则给父级添加一个children属性,并赋值
}
return father[pidFieldName]==0;//返回第一层
});
return tree; //返回树形数据
}
用法:
var department_comboxtree = setTreeData(data, "id","_parentId", "children")