You need to enable JavaScript to run this app. 使用递归将自底向上员工数据转换为自顶向下层级结构
优惠活动
大模型
产品
解决方案
定价
更多

使用递归将自底向上员工数据转换为自顶向下层级结构

问题排查与修正方案

原有代码核心问题

  • 根节点的Children属性未赋值,递归生成的子节点列表没有和根节点绑定,最终输出的根节点只有名称没有层级结构
  • 递归逻辑混乱:遇到有下属的员工时,没有为该员工创建对应的Roo对象,也没有把递归得到的下属节点塞到该对象的Children属性里,所有节点都直接塞到全局传的children列表,完全丢失了层级关系
  • 没必要用ref传递列表,递归函数直接返回当前姓名对应的Roo对象,逻辑会清晰很多

修正后代码

// 主逻辑
var leader = empList.FirstOrDefault(x => x.Manager == string.Empty);
Roo root = BuildTree(empList, leader.Name);

// 递归构建树的函数,输入员工列表和当前节点姓名,返回构建好的Roo节点
Roo BuildTree(List<Emp> empList, string currentName)
{
    // 先创建当前节点
    var currentNode = new Roo
    {
        Name = currentName,
        Children = new List<Roo>()
    };
    // 找当前节点的所有直属下属
    var subordinates = empList.Where(x => x.Manager == currentName).ToList();
    // 遍历每个下属,递归构建下属节点,加到当前节点的Children里
    foreach (var sub in subordinates)
    {
        currentNode.Children.Add(BuildTree(empList, sub.Name));
    }
    // 如果需要把没有下属的节点的Children设为null,打开下方注释即可
    // if (!currentNode.Children.Any()) currentNode.Children = null;
    return currentNode;
}

// 之后直接序列化root为JSON即可

输出JSON结构示例

序列化后得到的层级结构符合要求:

{
  "Name": "RH",
  "Children": [
    {
      "Name": "JS",
      "Children": [
        {
          "Name": "AV",
          "Children": [
            {"Name":"TD","Children":[]},
            {"Name":"DL","Children":[]}
          ]
        }
      ]
    },
    {
      "Name": "DD",
      "Children": [
        {"Name":"KM","Children":[]}
      ]
    }
  ]
}

内容的提问来源于stack exchange,提问作者blue piranha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 10:06:08