层级结构编号逻辑错误排查:代码问题分析与修正咨询
层级编号生成代码的逻辑错误分析
给定层级编号生成规则:
- Level 1的项编号为其在Level 1的位置;
- 项层级高于前一项时,作为前一项的子项,编号为前项编号追加分段(从1开始);
- 项层级与前一项相同时,作为同级项,编号为前项编号最后分段加1;
- 项层级低于前一项时,作为最近同层级祖先的子项,重置本级及更低层级的计数后加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
相关产品推荐
相关产品推荐

