递归深度遍历多层嵌套对象需先判断是否为普通对象(排除null并用object.prototype.tostring.call确认),再递归处理属性值;支持路径追踪与循环引用检测(weakmap记录已访问对象)。

用递归函数深度遍历不规则的多层嵌套对象,核心是:识别当前值是否为对象(且非 null)、递归处理其每个属性值;遇到基础类型就直接操作或收集。
判断可递归的条件要严谨
不能只用 typeof obj === 'object',因为 null、数组、日期、正则等也返回 'object'。稳妥做法是:
- 先排除
null(obj === null) - 再用
Object.prototype.toString.call(obj) === '[object Object]'确认是普通对象 - 如果需要同时处理数组,可额外加
Array.isArray(obj)分支
递归主体结构要简洁明确
每次调用函数时,传入当前层级的对象和一个用于累积结果的容器(如数组或 Map),或直接在内部做业务逻辑(如查找、修改、打印)。示例结构:
- 对对象的每个
key in obj遍历 - 获取
value = obj[key] - 若 value 是普通对象,递归调用自身:
traverse(value, ...) - 否则执行目标操作(如收集 key-path、匹配值、替换字段等)
避免无限递归的关键细节
不规则嵌套可能含循环引用(比如 a.b = c; c.a = a),直接递归会栈溢出。解决方法:
- 维护一个已访问对象的 WeakMap 或 Set,记录引用地址
- 每次进入新对象前检查是否已处理过:
if (seen.has(obj)) return - WeakMap 更安全,因为它只存对象引用,不影响垃圾回收
带路径信息的遍历更实用
很多场景需要知道某个值在哪一层、哪个键下(例如查找特定 key 的所有值、序列化路径)。可在递归时传递当前路径字符串或数组:
- 初始调用:
traverse(obj, 'root') - 递归子项:
traverse(value, `${path}.${key}`)(对象)或`${path}[${index}]`(数组) - 路径可用于日志、错误定位、生成 schema 路径等
不复杂但容易忽略边界和循环,写清楚判断、递进、终止三步,就能稳稳跑通任意嵌套结构。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











