使用forEach循环实现find函数时return不生效该如何解决?
forEach版本find函数异常的原因与解决方案
错误实现的问题
你给出的forEach版本代码无法正常返回索引,是forEach的底层机制决定的:
function find(array, element) { array.forEach((_, i) => { if (array[i] === element) { // 这里的return只会退出当前这一次的forEach回调,不会中断整个遍历,也不会给外层find函数返回值 return i; } }) return "Not found"; }
forEach设计时就不支持中途终止遍历,所有迭代逻辑都会执行完,回调内的return只能跳过当前次的后续逻辑,无法跳出整个forEach方法,因此永远不会触发找到元素后的提前返回,最终只会执行到最后的return "Not found"。
可运行的兼容方案
如果一定要用forEach实现(不推荐,性能劣于普通for循环),可以通过外部变量存储匹配结果:
function find(array, element) { let matchIndex = "Not found"; array.forEach((item, index) => { if (item === element) { matchIndex = index; } }) return matchIndex; }
注意该方案即使找到匹配元素,仍会遍历完整个数组,大数组场景下性能损耗明显。
更简洁的推荐实现
方案1:使用JS内置findIndex方法
不用手动写遍历逻辑,原生支持提前终止,性能最优:
let array = [2,3,5,7,11]; function find(array, element) { const index = array.findIndex(item => item === element); return index === -1 ? "Not found" : index; } console.log(find(array, 5)) // 输出2 console.log(find(array, 12)) // 输出Not found
方案2:使用for...of循环
语法简洁,支持提前return中断,性能和普通for循环一致:
function find(array, element) { for (const [index, item] of array.entries()) { if (item === element) return index; } return "Not found"; }
内容的提问来源于stack exchange,提问作者Matteo
相关产品推荐
相关产品推荐

