如何获取树形JS对象深度?数组根节点场景代码优化
计算类JSON结构(根为数组)的层级深度
你可以直接修改原有的深度计算函数,让它同时支持数组和普通对象作为输入,无需额外判断根节点类型或手动迭代数组元素。核心思路是把数组和对象统一视为「可遍历的层级容器」,自动处理其子元素的递归计算。
优化后的深度计算函数
function getStructureDepth(item) { // 非对象/数组或null,没有子层级,返回0 if (typeof item !== 'object' || item === null) return 0; // 区分数组和普通对象,获取子元素集合 const children = Array.isArray(item) ? item : Object.values(item); // 空容器(空数组/空对象)深度为1,否则取子元素最大深度+1(自身层级) return children.length === 0 ? 1 : 1 + Math.max(...children.map(getStructureDepth)); }
函数逻辑说明
- 基础判断:如果传入的不是对象/数组(或为
null),说明是基础类型值,没有子层级,返回0。 - 子元素获取:数组直接取自身元素作为子项,普通对象取所有值的集合作为子项。
- 深度计算:
- 空数组/空对象的深度为
1(仅自身这一层)。 - 非空容器的深度为「子元素的最大深度 + 1」(加的1是当前容器自身的层级)。
- 空数组/空对象的深度为
测试用例
// 单个对象结构 const singleObj = { a: { b: { c: 1 } } }; console.log(getStructureDepth(singleObj)); // 输出:3 // 数组根节点,包含不同深度的对象 const arrayRoot1 = [{ a: { b: 1 } }, { c: { d: { e: 2 } } }]; console.log(getStructureDepth(arrayRoot1)); // 输出:4 // 空数组 const emptyArray = []; console.log(getStructureDepth(emptyArray)); // 输出:1 // 混合数组与嵌套对象的结构 const arrayRoot2 = [{ x: [1, { y: { z: 3 } }] }, 5]; console.log(getStructureDepth(arrayRoot2)); // 输出:4
对比原有方案的优势
原来的写法可能需要单独判断根节点是否为数组,再手动遍历数组元素计算深度后取最大值,而优化后的函数无需额外判断逻辑,无论传入的是单个对象还是对象数组,直接调用即可得到正确的整体深度。
内容的提问来源于stack exchange,提问作者user17869571
相关产品推荐
相关产品推荐

