JavaScript:检查嵌套对象是否存在真值及代码异常排查
嘿,我来帮你揪出这个函数的问题!它总是返回true其实有几个很明显的错误,咱们一步步拆解:
1. 函数参数用错了,循环根本没执行
你的函数定义是function checkFalse(obj),但外层循环却写了for (var i in e)——这里的e根本没定义啊!浏览器会把e当成undefined,所以这个循环直接跳过,函数压根没做任何检查就走到了最后的return true,这就是它一直返回true的核心原因。你得把e改成参数名obj:
for (var i in obj) {
2. 遍历的是字符串而非嵌套对象
就算你修正了第一个问题,第二个循环for (var j in i)还是不对。这里的i是外层循环拿到的键名(比如"colors"、"sizes"),它是个字符串,不是你要检查的嵌套对象。你得先通过obj[i]拿到对应的嵌套对象,再遍历它的键:
for (var i in obj) { var nestedObj = obj[i]; // 拿到colors或者sizes这个嵌套对象 for (var j in nestedObj) {
3. 逻辑可能和你的需求不匹配
你说要“检查嵌套对象中是否存在真值”,但原函数的逻辑是:只要找到一个false就返回false,否则返回true——这其实是在检查所有值是不是全为true。如果你的真实需求是确认有没有至少一个真值(比如测试对象里的square: true),那逻辑得调整:
- 遍历的时候,只要碰到真值就立刻返回
true - 全部遍历完都没找到,再返回
false
修正后的函数示例
如果需求是「检查是否存在至少一个真值」
function checkHasTruthy(obj) { for (var key in obj) { var nestedObj = obj[key]; for (var nestedKey in nestedObj) { // 这里直接判断真值,0、""、null、undefined这类也会被视为假值,按需调整 if (nestedObj[nestedKey]) { return true; } } } return false; } // 测试你的对象 var test = {"colors":{"blue":false}, "sizes":{"square":true}}; console.log(checkHasTruthy(test)); // 输出true,因为存在square: true
如果需求是「检查所有值是否全为true」(原函数的意图)
function checkAllTrue(obj) { for (var key in obj) { var nestedObj = obj[key]; for (var nestedKey in nestedObj) { if (!nestedObj[nestedKey]) { return false; } } } return true; } console.log(checkAllTrue(test)); // 输出false,因为blue是false
内容的提问来源于stack exchange,提问作者Joe82
相关产品推荐
相关产品推荐

