如何将对象所有键(含嵌套对象)统一设为true或false?
递归设置对象所有键的布尔值
要实现将对象(包括嵌套对象)的所有键统一设置为true或false,需要通过递归遍历处理每一层嵌套对象,而不是直接覆盖顶层的嵌套属性。
解决方案代码
首先定义一个递归函数,用来遍历并修改对象的所有属性:
function setAllBooleanValues(obj, targetValue) { Object.keys(obj).forEach(key => { const val = obj[key]; // 仅处理非null的对象类型(排除null,因为typeof null === 'object') if (typeof val === 'object' && val !== null) { // 递归处理嵌套对象 setAllBooleanValues(val, targetValue); } else { // 将当前属性设置为目标布尔值 obj[key] = targetValue; } }); }
使用示例
const odba = { "all": false, "allA": false, "allB": false, "allC": { "allD": false, "allE": { "allF": true }, } }; // 将所有属性设置为false setAllBooleanValues(odba, false); console.log(odba);
运行后输出符合预期:
{ all: false, allA: false, allB: false, allC: { allD: false, allE: { allF: false } } }
你之前代码的问题分析
- 第一段代码:仅遍历了对象的顶层键,遇到嵌套对象(比如
allC)时直接将其赋值为false,没有递归处理内部的allD、allE等键。 - 第二段代码:错误地判断
typeof key === 'object'——key是字符串类型的属性名,永远不会是对象;应该判断的是obj[key]的类型。同时递归逻辑错误,没有正确指向嵌套对象的属性,导致无法处理深层结构。
补充:处理数组的情况
如果你的数据结构包含数组,只需在函数中增加数组判断,遍历数组元素处理:
function setAllBooleanValues(obj, targetValue) { if (Array.isArray(obj)) { obj.forEach(item => setAllBooleanValues(item, targetValue)); return; } if (typeof obj === 'object' && obj !== null) { Object.keys(obj).forEach(key => setAllBooleanValues(obj[key], targetValue)); } else { obj = targetValue; } }
内容的提问来源于stack exchange,提问作者Honey Singh
相关产品推荐
相关产品推荐

