为何JS函数getCurrentReport返回undefined?循环返回逻辑咨询
问题原因分析与解决方案
这个问题我太熟悉了,核心是你搞混了回调函数的返回值和外层函数的返回值!我给你拆解清楚:
在你的getCurrentReport函数里,你用forEach遍历数组时,里面的return e其实是从forEach的回调箭头函数里返回,根本不是从getCurrentReport本身返回。forEach方法不会处理回调的返回值,它只是单纯执行每个元素的回调逻辑,所以整个getCurrentReport函数执行完后没有任何对外的返回语句,自然会默认返回undefined——这就是loadReport里打印report是undefined的原因。
修复方案
方案1:用Array.find()(最推荐)
find方法就是专门用来查找数组中第一个符合条件的元素的,它会直接返回找到的元素,找不到则返回undefined,完美匹配你的需求:
getCurrentReport(id) { return this.reports.find(e => e.id === id); }
修改后,getCurrentReport就能正确返回目标对象,loadReport里的report也就不会是undefined了。
方案2:如果一定要用遍历逻辑(比如兼容旧环境)
如果你因为某些原因必须手动遍历,可以在外层函数定义一个变量存储目标对象,找到后赋值,最后返回这个变量。另外推荐用some代替forEach,因为some可以通过返回true终止遍历,更高效:
getCurrentReport(id) { let targetReport; this.reports.some(e => { if (e.id === id) { targetReport = e; return true; // 找到后立刻终止循环 } }); return targetReport; }
内容的提问来源于stack exchange,提问作者Farid
相关产品推荐
相关产品推荐

