js对扁平层级的json生成tree形式的数据

方法一(经测试,平均执行时间在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")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值