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

如何编写递归函数计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:47:10