2016-04-25 241 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 –