You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:03:12