2016-04-25 31 views
1

Ich habe ein Array. Ich habe eine Funktion, die überprüft, ob das Array die Nummer '2' enthält oder nicht.Verlassen Funktion bei Rückgabe

Wenn die Nummer gefunden wird, möchte ich, dass die Funktion wahr zurückgibt. Wenn nicht, sollte es false zurückgeben.

Ich schrieb dies:

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

Meine Erwartung war, dass auf der zweiten forEach Iteration, die, wenn die Bedingung erfüllt werden würde und die Funktion zurückkehren würde wahr.

Dies ist jedoch die Konsolenausgabe:

Two! 
No two :(
false 

Ich glaube, dass die erste return-Anweisung aus dem bedingten Block zurückkehrt, nicht die einschließende Funktion. (Ist das richtig?)

ich geschrieben habe, die Funktion mit einer Variablen den Rückgabewert zu speichern:

function hasTwo(arr) { 

let result = false 

    arr.forEach((x) => { 
     if (x === 2) { 
      console.log("Two!") 
      result = true 
     } 
    }) 

    return result 
} 

Aber ich sehe nicht der Punkt der Funktion, wenn die x fort === 2 Bedingung wurde erfüllt. Gibt es eine Möglichkeit, einen Wert zurückzugeben und die Funktion sofort zu beenden?

+0

Sie geben Wert innerhalb der Rückruffunktion zurück –

+0

Warum nicht '.filter()'? – evolutionxbox

+0

@evolutionxbox: Weil Filter die Iteration auch nicht beendet? – Bergi

Antwort

2

können Sie nicht return von der äußeren Funktion innerhalb des forEach Rückruf -, dass nur von der Callback-Funktion zurückgibt.

Sie können eine forEach Schleife (ohne Ausnahme) nicht brechen, und Sie sollten nicht versuchen. Was Sie eigentlich suchen, ist die 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

Die return Anweisung kehrt sofort von der Funktion zurück, in der sie sich befindet, nicht von alle umgebenden Funktionen.

Sie können .forEach() Iteration nicht anders als durch das Auslösen einer Ausnahme stoppen, die kontraproduktiv wäre, wenn Sie über die Leistung besorgt sind. Was Sie können tun, ist .some() anstatt:

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

Die Iteration mit .some() so bald stoppen wird als einer der Rückrufe true zurückgibt.

+0

Warum ES6 Pfeilfunktionen verwenden, sollte das OP nicht ein ES6-Tag dafür verwenden? – evolutionxbox

+2

@evolutionxbox gibt es keinen besonderen Grund in diesem Fall; Ich habe nur versucht, mit dem Code in der Frage übereinzustimmen. – Pointy

+0

Guter Punkt (kein Wortspiel), wäre es gut, das ES2015-Tag hinzuzufügen? – evolutionxbox

0

Sie haben zwei Funktionen. Es kehrt also von der ersten Funktion und nicht von der Elternfunktion zurück. Die übergeordnete Funktion wird ordnungsgemäß ausgeführt. Stattdessen können Sie so etwas wie:

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

Verwenden Sie vielleicht .indexOf statt Iteration selbst?

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

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

[Sie könnten sogar _more_ general ... sein;)] (https://jsfiddle.net/kym3anqe/) – Andy

+0

@Andy Nun, du könntest * noch mehr * allgemein sein und den Namen in 'contains' ändern. Ich habe mich nur an der Frage orientiert. : D –

Verwandte Themen