如何统计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
相关产品推荐
相关产品推荐

