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

如何统计JavaScript对象的嵌套深度?示例深度为4

如何统计JavaScript对象/数组的嵌套深度?

刚好之前做项目时遇到过完全一样的需求,我来分享几个实用的实现方法,刚好能匹配你给出的示例(最终返回深度4)。

先把你的示例数据整理成可运行的代码:

const sampleData = { 
  first: [ 
    { 
      value: '', 
      children: [ 
        { 
          value: '', 
          children: [ 
            { 
              value: '', 
              children: [ 
                { value: '', children: [] }, 
                { value: '', children: [] } 
              ] 
            } 
          ] 
        } 
      ] 
    } 
  ] 
};

核心思路

统计嵌套深度的本质是递归遍历所有嵌套的对象/数组,每进入一层就把深度加1,全程记录遍历过程中的最大深度。需要注意两个关键点:

  • 区分普通值(字符串、数字、布尔等)和可遍历的对象/数组
  • 可选:处理循环引用(避免无限递归报错)

基础版实现(无循环引用场景)

如果你的数据不会出现对象引用自身的情况,这个版本足够简单高效:

function getNestedDepth(target, currentDepth = 1) {
  // 非对象/数组直接返回当前深度
  if (typeof target !== 'object' || target === null) {
    return currentDepth;
  }

  let maxDepth = currentDepth;
  // 遍历所有属性(数组的索引也是属性)
  for (const key in target) {
    // 只遍历自身属性,避免继承的原型属性干扰
    if (Object.prototype.hasOwnProperty.call(target, key)) {
      const childDepth = getNestedDepth(target[key], currentDepth + 1);
      maxDepth = Math.max(maxDepth, childDepth);
    }
  }

  return maxDepth;
}

// 测试示例数据
console.log(getNestedDepth(sampleData)); // 输出 4,完全符合预期

逻辑说明

  • 初始深度设为1:因为最外层的结构本身就算第一层(比如示例里的最外层{}是第1层)
  • 每遇到一个对象/数组,就递归进入下一层,深度+1
  • 每次递归后比较更新最大深度,确保最终返回的是整个结构的最深层级

增强版实现(支持循环引用)

如果你的数据可能出现循环引用(比如const obj = {}; obj.self = obj),上面的基础版会无限递归导致栈溢出。这个版本通过Set记录已访问的对象,避免死循环:

function getNestedDepthWithCircularCheck(target, currentDepth = 1, visited = new Set()) {
  if (typeof target !== 'object' || target === null) {
    return currentDepth;
  }

  // 如果已经访问过当前对象,直接返回当前深度,避免循环递归
  if (visited.has(target)) {
    return currentDepth;
  }
  visited.add(target);

  let maxDepth = currentDepth;
  for (const key in target) {
    if (Object.prototype.hasOwnProperty.call(target, key)) {
      const childDepth = getNestedDepthWithCircularCheck(target[key], currentDepth + 1, visited);
      maxDepth = Math.max(maxDepth, childDepth);
    }
  }

  // 遍历完当前对象的所有子节点后,从集合中移除,不影响其他分支的遍历
  visited.delete(target);

  return maxDepth;
}

// 测试循环引用场景
const circularObj = { a: [] };
circularObj.a.push(circularObj);
console.log(getNestedDepthWithCircularCheck(circularObj)); // 输出 2

额外注意点

  • 数组和对象的处理逻辑是统一的,因为在JS里数组本质也是对象
  • 如果你的需求里需要把空数组/空对象排除在深度计算外,可以在递归前加判断(比如if (Object.keys(target).length === 0) return currentDepth;),但你的示例中空children数组不影响最终结果,因为我们取的是最大深度

内容的提问来源于stack exchange,提问作者Unknown Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:29:31