我有一个数组。我有一个函数检查数组是否包含数字'2'。
如果找到了数字,我希望该函数返回true。如果没有,它应该返回false。
我写了这个:
function hasTwo(arr) {
arr.forEach((x) => {
if (x === 2) {
console.log("Two!")
return true
}
})
console.log("No two :(")
return false
}
let arr = [1,2,3,4,5,6]
console.log(hasTwo(arr))
我的期望是,在第二次forEach迭代中,将满足if条件并且函数将返回true。
但是,这是控制台输出:
Two!
No two :(
false
我相信第一个return语句是从条件块返回的,而不是封闭函数。 (是吗?)
我用一个变量来重写函数来存储返回值:
function hasTwo(arr) {
let result = false
arr.forEach((x) => {
if (x === 2) {
console.log("Two!")
result = true
}
})
return result
}
但是如果满足x === 2条件,我看不到函数的重点。有没有办法返回一个值并立即退出函数?
答案 0 :(得分:4)
return
语句会立即从其所在的函数返回,而不是从所有周围函数返回。
除了通过抛出异常之外,您不能停止.forEach()
次迭代,如果您关注性能,这将会适得其反。您可以做的是使用.some()
代替:
var result = arr.some((x) => { return x === 2; });
只要其中一个回调返回.some()
,true
的迭代就会停止。
答案 1 :(得分:4)
也许使用.indexOf
代替自己迭代?
function hasTwo(arr) {
return arr.indexOf(2) !== -1
}
let arr = [1,2,3,4,5,6]
console.log(hasTwo(arr))
答案 2 :(得分:2)
你不能return
来自forEach
回调中的外部函数 - 只能从回调函数返回。
你不能打破forEach
循环(没有例外),你不应该尝试。您实际需要的是some
Array method。
function hasTwo(arr) {
var result = arr.some(x => x === 2);
console.log(result ? "Two!" : "No two :(");
return result;
}
let arr = [1,2,3,4,5,6]
console.log(hasTwo(arr))
答案 3 :(得分:0)
你有两个功能。所以它从第一个函数而不是父函数返回。父函数按预期执行。相反,你可以做类似的事情:
function hasTwo(arr) {
for (i = 0; i < arr.length; i++) {
if (arr[i] === 2) {
console.log("Two!");
return true;
}
console.log("No two :(");
return false;
}
let arr = [1,2,3,4,5,6]
console.log(hasTwo(arr));