为何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
相关产品推荐
相关产品推荐

