使用Lodash的.reduce判断对象是否未定义结果异常,求排查
问题分析与解决方案
嘿,问题出在两个关键地方——逻辑运算符用反了,而且遍历的范围也不对!咱们一步步拆解:
首先看你的checker1,它的核心逻辑是三个目标属性全为undefined时返回true,也就是用&&做逻辑与,只有所有条件都满足才为true。但你的checker2犯了两个明显错误:
1. 逻辑运算符与初始值不匹配
你写的checker || (val == undefined)搭配初始值false,逻辑变成了「只要有一个属性是undefined,结果就为true」,这和你要的「所有属性都是undefined才为true」完全相反!
正确的逻辑应该是用&&,并且初始值设为true:初始假设所有属性都符合条件,每检查一个属性,只要有一个不是undefined,结果就变成false,直到遍历完所有目标属性。
2. 遍历范围不对
你的checker1只检查p1下的o1、o2、o3三个属性,但checker2遍历的是level1.test[testState.Id]的所有属性——如果这个对象还有其他属性(比如p2、p3),只要其中一个不是undefined,checker2就会返回false,这显然不是你要的结果。
修正后的代码
方法一:直接遍历目标属性数组(最直观)
// 先把要检查的三个属性提取成数组 const targetValues = [ level1.test[testState.Id]['p1']['o1'], level1.test[testState.Id]['p1']['o2'], level1.test[testState.Id]['p1']['o3'] ]; // 用reduce实现全undefined判断 const checker2 = _.reduce(targetValues, (isAllUndefined, val) => { return isAllUndefined && (val === undefined); // 用===更严谨,避免匹配null }, true); // 初始值设为true,默认所有都符合条件 console.log('checker', checker2); // 现在会返回正确的true
方法二:限定遍历p1下的指定属性
如果你想直接遍历p1对象,记得只检查o1、o2、o3这三个键:
const checker2 = _.reduce(level1.test[testState.Id]['p1'], (isAllUndefined, val, key) => { // 跳过非目标键 if (!['o1', 'o2', 'o3'].includes(key)) return isAllUndefined; return isAllUndefined && (val === undefined); }, true);
额外提示
建议用=== undefined代替== undefined,因为== undefined会同时匹配null和undefined,如果你的需求是严格判断「未定义」,===更准确。
内容的提问来源于stack exchange,提问作者Knowledge Seeker
相关产品推荐
相关产品推荐

