层级子节点数量统计求助:遍历最多5级嵌套children数组
嵌套层级子节点数量统计解决方案
核心思路
不管嵌套层级是2-5级,都可以用广度优先遍历(BFS)或递归遍历逐层处理:
- BFS通过队列记录当前层级的所有节点,处理完一层就统计对应数据,再将下一层节点加入队列,层级控制更直观
- 递归则传递当前层级参数,每进入一层就更新对应层级的统计值
以下以JavaScript为例,实现两种常见统计需求:
需求1:统计每个层级的节点总数
比如根节点为第0层,其子节点为第1层,统计每层包含的节点数量
代码实现
// 示例嵌套数据结构 const data = { id: 'root', children: [ { id: 'level1-1', children: [{ id: 'level2-1' }, { id: 'level2-2', children: [{ id: 'level3-1' }] }] }, { id: 'level1-2', children: [{ id: 'level2-3' }] } ] }; function countNodesByLevel(root) { const levelCounts = {}; if (!root) return levelCounts; // 队列元素格式:[当前节点, 当前层级] const queue = [[root, 0]]; while (queue.length > 0) { const [node, level] = queue.shift(); // 累加当前层级的节点数 levelCounts[level] = (levelCounts[level] || 0) + 1; // 子节点加入下一层队列 if (node.children?.length) { node.children.forEach(child => queue.push([child, level + 1])); } } return levelCounts; } // 调用示例 const result = countNodesByLevel(data); console.log(result); // 输出:{ 0: 1, 1: 2, 2: 3, 3: 1 }
需求2:统计每个层级节点的子节点总数
即统计第N层所有节点的children数量之和
代码实现
function countChildrenByLevel(root) { const levelChildCounts = {}; if (!root) return levelChildCounts; const queue = [[root, 0]]; while (queue.length > 0) { const [node, level] = queue.shift(); // 累加当前层级节点的子节点总数 if (node.children?.length) { levelChildCounts[level] = (levelChildCounts[level] || 0) + node.children.length; } else { levelChildCounts[level] = (levelChildCounts[level] || 0) + 0; } // 子节点加入下一层队列,若需限制最多5级,可加判断:level + 1 <= 5 if (node.children?.length) { node.children.forEach(child => queue.push([child, level + 1])); } } return levelChildCounts; } // 调用示例 const result2 = countChildrenByLevel(data); console.log(result2); // 输出:{ 0: 2, 1: 3, 2: 1, 3: 0 }
适配说明
- 如果数据源是多根节点的数组,只需将初始队列改为
rootArray.map(item => [item, 0])即可 - 层级编号可按需调整(比如从1开始计数,只需把初始层级设为1)
- 若需限制最多处理5级,在将子节点加入队列前添加判断:
if (level + 1 <= 5)
内容的提问来源于stack exchange,提问作者Алексей Синельник
相关产品推荐
相关产品推荐

