You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript按组织层级排序含员工经理信息二维数组问题求助

现有代码的问题

  • 未单独处理表头:你直接对包含表头的完整数组执行排序,表头["Name", "Manager"]也参与了比较逻辑,自然会出现排序位置异常的问题。
  • 比较逻辑存在严重缺失:你写的compare函数只处理了两个人员存在直接上下级关系的场景,对于没有直接上下级的人员(比如Penny和Bernadette),没有判断二者的层级高低,最终只会落到姓名字母排序的分支,所以输出结果只有字母排序效果。
  • 不符合Array.sort的比较逻辑要求:sort方法要求比较函数的判断是可传递的(如果a>b,b>c,那么a>c),你的逻辑只覆盖了直接上下级判断,跨层级的比较规则完全缺失,无法满足层级排序的要求。

替代实现方案(构造层级树遍历)

这种层级嵌套的排序需求,更适合用「构造关系树+深度优先遍历」的方式实现,逻辑清晰且不易出错,实现步骤如下:

  1. 拆分表头和实际员工数据,表头单独保留最后拼接结果
  2. 构造经理-下属列表的映射表,同时找到层级最高的根节点(自己是自己经理的人员)
  3. 对每个经理的下属列表先按姓名字母升序排序,再深度优先遍历整棵树,按遍历顺序收集员工数据
  4. 拼接表头和遍历得到的员工数组,得到最终结果

代码示例

var array = [
  ["Name", "Manager"],
  ["Leonard", "Penny"],
  ["Penny", "Professor Proton"],
  ["Sheldon", "Bernadette"],
  ["Raj", "Penny"],
  ["Professor Proton", "Professor Proton"],
  ["Howard", "Bernadette"],
  ["Bernadette", "Professor Proton"]
];

// 拆分表头和数据
const [header, ...staffList] = array;
// 构建经理-下属映射表
const managerMap = {};
let root = null;
staffList.forEach(staff => {
  const [name, manager] = staff;
  // 找到根节点
  if (name === manager) {
    root = staff;
    return;
  }
  if (!managerMap[manager]) managerMap[manager] = [];
  managerMap[manager].push(staff);
});

// 深度优先遍历收集结果
const result = [];
function dfs(current) {
  result.push(current);
  const [name] = current;
  const subordinates = managerMap[name] || [];
  // 下属先按姓名字母排序
  subordinates.sort((a,b) => a[0].toLowerCase().localeCompare(b[0].toLowerCase()));
  subordinates.forEach(sub => dfs(sub));
}
dfs(root);

// 拼接表头得到最终结果
const finalResult = [header, ...result];
console.log(finalResult);

运行后输出结果和你要求的预期完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:27:00