找网上在了很久如何将一张表含无限层级的数据,分层级赋值到实体类类中,并生成JSON字符串,没有找到合适的例子。于是自己采用递归写了一个。
先看代码
private static void Demo()
{
List<Limit> limits = new List<Limit>();
limits.Add(new Limit { id = 1, pid = 0, name = "任务管理" });
limits.Add(new Limit { id = 2, pid = 0, name = "任务维护" });
limits.Add(new Limit { id = 3, pid = 1, name = "下载" });
limits.Add(new Limit { id = 4, pid = 3, name = "下载1" });
limits.Add(new Limit { id = 5, pid = 3, name = "下载2" });
var dd = ToHierarchy(limits);
string json = JsonConvert.SerializeObject(dd);
Console.WriteLine(json);
Console.ReadLine();
}
/// <summary>
/// 将实体类转换为层级形式
/// </summary>
/// <param name="limits"></param>
/// <param name="pid"></param>
/// <returns></returns>
public static List<Limit> ToHierarchy(List<Limit> limits, int? pid = 0)
{
List<Limit> newLimitList = new List<Limit>();
newLimitList = limits.Where(t => t.pid == pid).ToList();
for (int i = 0; i < newLimitList.Count; i++)
{
newLimitList[i].Limits = ToHierarchy(limits, newLimitList[i].id);//下一层级
}
return newLimitList;
}
public class Limit
{
public int id { get; set; }
public int? pid { get; set; }
public string name { get; set; }
public List<Limit> Limits { get; set; }
}
最后的效果
[
{
"id": 1,
"pid": 0,
"name": "任务管理",
"Limits": [
{
"id": 3,
"pid": 1,
"name": "下载",
"Limits": [
{
"id": 4,
"pid": 3,
"name": "下载1",
"Limits": []
},
{
"id": 5,
"pid": 3,
"name": "下载2",
"Limits": []
}
]
}
]
},
{
"id": 2,
"pid": 0,
"name": "任务维护",
"Limits": []
}
]
方法二:采用前端js方法进行层级转换
function setTreeData(source){
let cloneData = JSON.parse(JSON.stringify(source)) // 对源数据深度克隆
return cloneData.filter(father=>{ // 循环所有项,并添加children属性
let branchArr = cloneData.filter(child=> father.id == child.parentId); // 返回每一项的子级数组
branchArr.length>0 ? father.children=branchArr : '' //给父级添加一个children属性,并赋值
return father.parentId==0; //返回第一层
});
}
当然对于上述的递归用法,还有很多可以拓展的地方。欢迎大家在下面留言讨论哦!