
本文介绍一种简洁可靠的递归方法,用于深度遍历任意层级的嵌套对象,判断其所有布尔类型叶子值是否均为 true;遇到非布尔值将被忽略,对象内部结构不影响逻辑,支持任意深度嵌套。
本文介绍一种简洁可靠的递归方法,用于深度遍历任意层级的嵌套对象,判断其**所有布尔类型叶子值是否均为 `true`**;遇到非布尔值将被忽略,对象内部结构不影响逻辑,支持任意深度嵌套。
要对深层嵌套的 JavaScript 对象执行布尔全量校验(即“所有布尔值都必须为 true”),不能直接使用 Array.prototype.every()——因为该方法仅适用于数组,而目标数据是键值对组成的普通对象,且存在多层嵌套。此时需采用递归深度优先遍历(DFS)策略,逐层访问每个属性值,并统一判断其布尔语义。
核心思路如下:
- 若当前值为布尔类型(
typeof value === 'boolean'),则直接与期望值(如true)比较; - 若当前值为对象(且非
null,注意null的typeof也是'object'),则递归调用自身,对其所有自有属性值继续检验; - 若任一递归分支返回
false,立即短路返回false; - 若遍历完成未触发否定,则返回
true。
以下是经过健壮性增强的生产就绪版本(已处理 null、数组、函数等边界情况):
function allValuesTrue(obj) {
// 非对象或 null 直接退出:只有布尔值才参与判定
if (obj === null || typeof obj !== 'object') {
return typeof obj === 'boolean' ? obj === true : true; // 非布尔值视为“不干扰”,但更安全做法是跳过 —— 此处按语义:只校验布尔值,其余忽略
}
// 遍历所有自有属性(不含原型链)
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const val = obj[key];
// 递归检查子值;若子值校验失败,立即返回 false
if (!allValuesTrue(val)) {
return false;
}
}
}
return true;
}✅ 使用示例(基于提问中的原始数据结构):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
const nestedData = {
"2211284396232-5": {
"2211284396232-5": true,
"644889430161": {
"4812219518053": false,
"4812219518055": false,
"4812219518063": false,
"4812219518064": true,
"4812219518069": false,
"644889430161": false
}
},
"2211628865398-6": {
"2211628865398-6": false,
"729563966440": {
"5229922707373": false,
"729563966440": false
}
}
};
console.log(allValuesTrue(nestedData)); // false(因存在 false 值)⚠️ 注意事项:
- 该函数仅校验布尔类型值,字符串
"true"、数字1、undefined、null、数组、函数等均被跳过(不导致false),符合“只关心显式布尔值”的原始需求; - 若需扩展支持真值(truthy)判断(如
1,"ok",[]等),可将条件改为if (val == null || !val)并调整递归逻辑; - 对于超深嵌套对象(>10000 层),需警惕栈溢出风险,此时建议改用迭代式 BFS/DFS(借助栈或队列模拟递归);
- 若对象含循环引用,上述代码会无限递归;如需支持,应引入
WeakMap缓存已访问对象作去重检测。
总结:递归是处理嵌套结构的自然范式。通过精准类型判断 + 短路逻辑 + 自有属性过滤,即可在几行代码内实现健壮、可读、可复用的嵌套布尔校验器。

















