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

层级结构编号逻辑错误排查:代码问题分析与修正咨询

层级编号生成代码的逻辑错误分析

给定层级编号生成规则:

  1. Level 1的项编号为其在Level 1的位置;
  2. 项层级高于前一项时,作为前一项的子项,编号为前项编号追加分段(从1开始);
  3. 项层级与前一项相同时,作为同级项,编号为前项编号最后分段加1;
  4. 项层级低于前一项时,作为最近同层级祖先的子项,重置本级及更低层级的计数后加1。

现有代码生成的编号不符合规则,比如测试用例中:

  • Vegetables(level3)预期编号为1.2.1,实际得到1.2.2;
  • Brussels sprouts(level2)预期编号为3.1,实际得到3.3。

以下是代码逻辑错误的具体分析:

核心错误点

1. 全局层级计数未区分父层级,导致子项计数混乱

代码中使用levelCount对象全局累加每个层级的总数量,完全忽略了层级的父子归属关系。例如:

  • 测试用例中,Banana(level3)是Apple(level2)的子项,此时levelCount[3]被设为1;
  • 后续Vegetables(level3)是Fruit loops(level2)的子项,属于另一个父层级的子项,计数应从1开始,但代码直接将levelCount[3]加1变为2,导致生成错误的1.2.2。

2. 层级降低时未重置子层级计数

当遇到层级低于前一项的情况时,代码未对更高层级的计数进行重置,导致后续同层级项的计数错误。例如:

  • 测试用例中,从level5回到level1的Orange后,levelCount中level2、3、4、5的计数仍保留之前的累加值;
  • 后续Brussels sprouts(level2)是第3个level1项Broccoli的子项,本应从1开始计数,但代码使用了全局累加的levelCount[2] = 3,生成错误的3.3。

3. 未跟踪层级路径的父子关联

正确的层级编号需要跟踪当前项的完整父层级路径,每个父层级下的子层级计数是独立的。但现有代码仅独立统计每个层级的全局总数,无法区分不同父节点下的子项,导致编号逻辑完全偏离规则。

修正思路与示例代码

改用层级路径数组跟踪当前路径的计数,根据当前层级与前一项层级的关系动态调整数组:

  • 当前层级 > 前一层级:在路径数组末尾添加1(作为子项的初始计数);
  • 当前层级 == 前一层级:将路径数组最后一位加1(同级项递增);
  • 当前层级 < 前一层级:截断路径数组到当前层级长度,再将最后一位加1(回到父层级的下一个同级项)。

修正后的代码:

function generateHierarchicalNumbering(data) {
  const numbering = [];
  const currentPath = [];
  let prevLevel = 0;

  for (const item of data) {
    const currentLevel = item.level;

    if (currentLevel > prevLevel) {
      // 进入子层级,初始计数为1
      currentPath.push(1);
    } else if (currentLevel === prevLevel) {
      // 同级项,最后一位计数加1
      currentPath[currentPath.length - 1]++;
    } else {
      // 回到更高层级,截断路径后最后一位加1
      currentPath.splice(currentLevel);
      currentPath[currentPath.length - 1]++;
    }

    item.number = currentPath.join('.');
    numbering.push({ ...item });
    prevLevel = currentLevel;
  }

  return numbering;
}

// 测试用例
const jsonData1 = [
  { "name": 'Fruit', "level": 1 },
  { "name": 'Apple', "level": 2 },
  { "name": 'Banana', "level": 3 },
  { "name": 'Fruit loops', "level": 2 },
  { "name": 'Vegetables', "level": 3 },
  { "name": 'Green', "level": 4 },
  { "name": 'Green', "level": 4 },
  { "name": 'Green', "level": 5 },
  { "name": 'Orange', "level": 1 },
  { "name": 'Broccoli', "level": 1 },
  { "name": 'Brussels sprouts', "level": 2 },
  { "name": 'Pumpkins', "level": 2 },
  { "name": 'Carrots', "level": 3 }
];

console.log(JSON.stringify(generateHierarchicalNumbering(jsonData1)));

运行修正后的代码,将生成符合规则的层级编号:

  • Vegetables的编号为1.2.1;
  • Brussels sprouts的编号为3.1;
  • 其余项的编号也完全符合规则要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:35:08