
本文介绍如何使用递归函数深度遍历任意层级的嵌套对象,将其中所有布尔类型的值(如 false)原地翻转为相反值(如 true),并提供可复用、健壮的实现方案。
本文介绍如何使用递归函数深度遍历任意层级的嵌套对象,将其中所有布尔类型的值(如 `false`)原地翻转为相反值(如 `true`),并提供可复用、健壮的实现方案。
在处理配置树、权限结构或表单状态等场景时,我们常遇到深层嵌套的对象,且需批量更新其中的布尔字段(例如“全选/反选”逻辑)。JavaScript 原生不提供直接遍历嵌套对象的 API,因此需借助递归 + Object.entries() 实现深度遍历。
以下是一个简洁、高效且可读性强的递归函数:
function toggleBooleanValues(obj) {
if (obj === null || typeof obj !== 'object') return;
Object.entries(obj).forEach(([key, value]) => {
if (typeof value === 'boolean') {
obj[key] = !value; // 翻转布尔值
} else if (typeof value === 'object') {
toggleBooleanValues(value); // 递归进入嵌套对象
}
// 忽略 string/number/function 等非对象非布尔类型(保持原值)
});
}✅ 使用示例:
const data = {
"2211284396232-5": {
"2211284396232-5": false,
"644889430161": {
"4812219518053": false,
"4812219518055": false,
"644889430161": false
}
},
"2211628865398-6": {
"2211628865398-6": false,
"729563966440": {
"5229922707373": false,
"729563966440": false
}
}
};
toggleBooleanValues(data);
console.log(data);
// 所有 false → true,true → false(若存在)⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 该函数原地修改(mutating) 原对象,如需保留原始数据,请先使用
structuredClone(obj)(现代环境)或深拷贝工具(如 Lodash 的_.cloneDeep); -
typeof null === 'object'是 JavaScript 的历史陷阱,因此开头显式检查obj === null,避免误入递归; - 若对象中存在
undefined、Array或Date等类型,本函数默认跳过处理(仅响应boolean和plain object),确保行为可预测; - 不建议使用
for...in(会遍历原型链)或JSON.parse(JSON.stringify())(无法处理函数、undefined、循环引用等)。
? 进阶提示:
若需支持「仅翻转特定键名」(如只翻转所有 "enabled" 字段)或「返回新对象而非修改原对象」,可扩展为高阶函数,传入 predicate 或 immutable: true 选项——这正是构建可维护状态管理逻辑的基础能力。
掌握这一模式,你便拥有了处理任意深度嵌套配置对象的核心工具。


















