2016-08-21 8 views
0

Ich war immer verwirrt über die beste Möglichkeit, damit umzugehen. Die Methode, die ich in der Vergangenheit benutzt habe, funktioniert, aber es scheint, als müsste es einen besseren Weg geben.Javascript-Break/Return-Funktion innerhalb der Funktion

Unten habe ich einen Codeabschnitt, den ich zurückgeben möchte item für die Funktion getData. Problem ist in dem Beispiel unten, das es für die Funktion forEach nicht die getData Funktion zurückgibt.

function getData() { 
    var array = ["element1","element2"]; 
    array.forEach(function (item) { 
     if (item == "element2") { 
      return item; 
     } 
    }); 
} 

Ich habe etwas getan, um dies zu überwinden.

function getData() { 
    var array = ["element1","element2"]; 
    var returnValue; 
    array.forEach(function (item) { 
     if (item == "element2") { 
      returnValue = item; 
     } 
    }); 
    if (returnValue) { 
     return returnValue; 
    } 
} 

Gibt es einen besseren Weg, damit umzugehen? Scheint so, als ob diese zusätzlichen 4 Zeilen Code nur Verwirrung und Unordnung in meinem Code erzeugen.

+5

['Array.prototype.find()'] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find) oder ['Array.prototype.indexOf' ] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) – zerkms

+0

Wenn Sie nur eine for-Schleife verwendet haben, könnten Sie einfach ohne Probleme zurückkehren. Wenn Sie das nicht schaffen, müssen Sie so etwas wie oben beschrieben tun. – Whothehellisthat

+0

Sie können dies vereinfachen, indem Sie die 'if'-Anweisung am Ende entfernen. Wenn returnValue nicht gesetzt wurde, wäre es "undefiniert", würde also undefined zurückgeben - genauso wie wenn if fehlschlägt; Die Funktion würde sowieso 'undefiniert' zurückgeben. – Whothehellisthat

Antwort

1

Man könnte Array#some

Die some() Methode Tests verwenden, ob ein Element in dem Array den Test durch die vorgesehene Funktion implementiert gibt.

function getData() { 
    var array = ["element1","element2"]; 
    var returnValue; 
    array.some(function (item) { 
     if (item == "element2") { 
      returnValue = item; 
      return true; 
     } 
    }); 
    return returnValue; 
} 

Oder, wenn Sie ES6 verwenden,

Die eine value im Array Array#find verwenden find() Methode gibt, wenn ein Element in dem Array die Prüffunktion vorgesehen erfüllt. Ansonsten undefiniert ist returned.

function getData() { 
    var array = ["element1","element2"]; 
    return array.find(item => item == "element2"); 
} 
+1

Das gleiche Problem, aber das wäre ein bisschen effizienter, stimme ich zu. – Whothehellisthat

+0

@Whothehellisthat was meinst du mit "Problem"? – zerkms

+0

@Nina Scholz: Wenn sie ES2015 verwenden, können sie mit Pfeilfunktionen noch mehr gewinnen. – zerkms

0

Sie können dies leicht mit Array#indexOf:

function getData() { 
    var array = ["element1","element2"]; 
    var index = array.indexOf("element2"); 
    return index === -1 ? null : array[index]; 
} 

In diesem Fall ist es funktioniert, weil, was Sie suchen ist ein === Spiel für das, was Sie haben. Der allgemeinere Fall ist ein Fall für Array#find, die eine ES2015 Sache ist, aber man kann es leicht shim/polyfill für ES5 und unten:

function getData() { 
    var array = ["element1","element2"]; 
    return array.find(function (item) { 
     return item == "element2"; 
    }); 
} 

... die Sie das Spiel auf einem komplexeren Zustand basierend festlegen kann.

0

Sie nur indexOf verwenden:

return array[array.indexOf("element2")]; 

Wenn es den Wert nicht findet, wird der Index -1 sein. Und der Index -1 eines beliebigen Arrays wird undefined sein.

Verwandte Themen