2016-04-25 82 views
1

我有一个数组。我有一个函数来检查数组是否包含数字'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迭代,如果条件得到满足,函数将返回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

你在回调函数中返回值 –

+0

为什么不使用'.filter()'? – evolutionxbox

+0

@evolutionxbox:因为过滤器不会退出迭代吗? – Bergi

回答

2

你不能从forEach回调内外部函数return - 只有从回调函数返回。

你不能破坏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)) 
4

return语句立即从它所在的函数返回,而不是从全部周围的函数中返回。

除了抛出一个异常,您不能停止.forEach()迭代,如果您关心性能,这将会适得其反。你可以是使用.some()代替:

var result = arr.some((x) => { return x === 2; }); 

作为回调的一个返回true.some()迭代将立即停止。

+0

为什么使用ES6箭头函数,OP不应该使用ES6标签? – evolutionxbox

+2

@evolutionxbox在这种情况下没有特别的原因;我只是试图与问题中的代码保持一致。 – Pointy

+0

好点(无双关),添加ES2015标签会不错? – evolutionxbox

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)); 
4

也许使用.indexOf而不是自己迭代?

function hasTwo(arr) { 
    return arr.indexOf(2) !== -1 
} 

let arr = [1,2,3,4,5,6]  
console.log(hasTwo(arr)) 
+0

[你可能会更加普遍......; )](https://jsfiddle.net/kym3anqe/) – Andy

+0

@Andy好吧,你可能*更多*一般,并将名称更改为'contains'。我只是在面对这个问题。 :d –