如何编写递归函数计算JavaScript对象的最大深度?
解决对象层级深度计算的递归问题
我来帮你搞定这个问题!你的核心需求是计算对象的最大层级深度(基于0索引)——比如示例里的对象有3层结构,最终要返回2,但你当前的递归代码错误地统计了所有节点的数量,而非追踪最深的层级。
问题根源
你之前的代码应该是在递归过程中把每个节点的深度值做了累加,而不是比较并保留最大的深度值。比如每个子节点都返回一个数值,然后你把它们加起来,结果自然变成了节点总数,而非我们需要的最深层级。
正确的递归实现思路
我们需要跟踪当前节点所在的层级,然后对每个子节点递归计算其深度,最终取所有子节点深度的最大值:
- 基准情况:如果当前节点没有
children属性,或者children是空数组,直接返回当前层级。 - 递归情况:遍历所有子节点,对每个子节点调用递归函数时,把当前层级+1传入,然后从所有子节点的返回值中取最大值。
代码实现
基础循环版本
function myFunction(obj, currentDepth = 0) { // 基准情况:没有子节点,返回当前层级 if (!obj.children || obj.children.length === 0) { return currentDepth; } let maxDepth = currentDepth; // 遍历所有子节点,计算每个子节点的深度并更新最大值 for (const child of obj.children) { const childDepth = myFunction(child, currentDepth + 1); if (childDepth > maxDepth) { maxDepth = childDepth; } } return maxDepth; }
简洁的数组方法版本
如果你喜欢更简洁的写法,可以用Array.map结合Math.max来实现:
function myFunction(obj, currentDepth = 0) { if (!obj.children || !obj.children.length) { return currentDepth; } // 映射所有子节点的深度,然后取最大值 return Math.max(...obj.children.map(child => myFunction(child, currentDepth + 1))); }
测试验证
用你提供的测试对象验证:
var test = { name: 'item 1', children: [{ name: 'level 1 item', children: [{ name: 'level 2 item' }, { name: 'second level 2 item', children: [{ name: 'level 3 item' }] }] }] }; var depth = myFunction(test); console.log(depth); // 输出2,完全符合预期
这样修改后,函数就会正确返回对象的最大层级深度(基于0索引)了。
内容的提问来源于stack exchange,提问作者sterix24
相关产品推荐
相关产品推荐

