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

为何Underscore的find方法会使已赋值变量变为undefined?代码实例解析

嘿,我来帮你分析下这个问题——你第一次调用_.find后progression的值完全符合预期,但第二次调用后它就变成undefined了,大概率是下面这几个常见原因:

最可能的几个诱因

1. 不小心用第二次_.find的结果覆盖了progression

这是最常见的情况!你可能在第二次调用_.find的时候,误把结果赋值给了同一个progression变量,而这次查找根本没匹配到任何元素。比如你的代码可能是这样的:

var progression = _.find(window.programCycle.progressions[progressionTabIndex], function (item) {
    console.log('item.id = ',parseInt(item.id));
    console.log('wId = ',parseInt(wId));
    console.log(parseInt(item.id) == parseInt(wId));
    return parseInt(item.id) == parseInt(wId);
});
console.log(progression); // 这里是正常的
// 问题出在这儿:把第二次查找的结果又赋值给了progression
progression = _.find(window.programCycle.meals, function(mealItem) {
    // 假设这个条件匹配不到任何元素
    return mealItem.id === someIdThatDoesntExist;
});
console.log(progression); // 自然就变成undefined了

解决办法很简单:把第二次查找的结果赋值给一个新变量,比如var meal = _.find(...),别再用progression了。

2. 第二次调用时修改了原数组或变量本身

虽然_.find本身不会修改原数组,但如果你的第二次_.find回调函数里不小心改动了window.programCycle.progressions数组,或者在其他地方主动把progression设置成了undefined,也会出现这个问题。不过这种情况概率相对低一些,你可以检查下有没有类似progression = undefined的代码。

3. 第二次调用的数据源或查找条件出问题了

如果第二次调用_.find的数据源不是你预期的数组(比如window.programCycle突然变成undefined,或者某个属性拼写错了),或者查找条件本身就不可能匹配到元素,那_.find会返回undefined——要是这时候你把它赋值给了progression,自然就覆盖了原来的有效值。

快速排查步骤
  • 先检查第二次_.find的变量赋值:确认是不是把结果给了progression,而不是新的变量(比如meal)。
  • 在第二次调用前后都打印progression的值,同时打印第二次调用的数据源和查找条件,看看是不是条件不对或者数据源出问题了。
  • 搜一下你的代码里有没有其他地方修改过progression变量。

举个正确的写法示例:

var progression = _.find(window.programCycle.progressions[progressionTabIndex], function (item) {
    return parseInt(item.id) === parseInt(wId);
});
console.log(progression); // 符合预期
// 把结果赋值给meal,不碰progression
var meal = _.find(window.programCycle.meals, function(mealItem) {
    return mealItem.id === targetMealId;
});
console.log(progression); // 这里还是原来的有效值

内容的提问来源于stack exchange,提问作者lost baby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:19:45