Wie stoppe ich eine JavaScript for-Schleife?


127

Ich verwende dieses JavaScript, um ein Array zu durchlaufen und ein passendes Array-Element zu finden:

var remSize = [], 
    szString, remData, remIndex, i;

for (i = 0; i < remSize.length; i++) {      
    // I'm looking for the index i, when the condition is true
    remSize[i].size == remData.size ? remIndex = i : remIndex = -1;     
}

Das Array enthält diese "Größen" : ["34", "36", "38"...].

remData.size ist die "Größe", die ich suche (zB "36").

Ich muss den Index zurückgeben, iwenn die gesuchte Größe im Index enthalten ist. Ansonsten muss ich zurückkehren -1. Gibt es einen besseren Weg, dies zu tun?

Antworten:


193

Um eine forSchleife in JavaScript frühzeitig zu stoppen , verwenden Sie break:

var remSize = [], 
    szString,
    remData,
    remIndex,
    i;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // Set a default if we don't find it
for (i = 0; i < remSize.length; i++) {      
     // I'm looking for the index i, when the condition is true
     if (remSize[i].size === remData.size) {
          remIndex = i;
          break;       // <=== breaks out of the loop early
     }
}

Wenn Sie sich in einer ES2015-Umgebung (auch bekannt als ES6) befinden, können Sie für diesen speziellen Anwendungsfall Array#findIndex(um den Index des Eintrags zu finden) oder Array#find(um den Eintrag selbst zu finden) Folgendes verwenden: Beide können shimmed / polyfilled sein:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = remSize.findIndex(function(entry) {
     return entry.size === remData.size;
});

Array#find::

var remSize = [], 
    szString,
    remData,
    remEntry;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remEntry = remSize.find(function(entry) {
     return entry.size === remData.size;
});

Array#findIndexstoppt das erste Mal, wenn der Rückruf einen wahrheitsgemäßen Wert zurückgibt, und gibt den Index für diesen Aufruf an den Rückruf zurück; Es wird zurückgegeben, -1wenn der Rückruf niemals einen wahrheitsgemäßen Wert zurückgibt. Array#findstoppt auch, wenn es findet, wonach Sie suchen, aber es gibt den Eintrag zurück, nicht seinen Index (oder undefinedwenn der Rückruf niemals einen wahrheitsgemäßen Wert zurückgibt).

Wenn Sie eine ES5-kompatible Umgebung (oder einen ES5-Shim) verwenden, können Sie die neue someFunktion für Arrays verwenden, die einen Rückruf aufruft, bis der Rückruf einen wahrheitsgemäßen Wert zurückgibt:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
remSize.some(function(entry, index) {
    if (entry.size === remData.size) {
        remIndex = index;
        return true; // <== Equivalent of break for `Array#some`
    }
});

Wenn Sie jQuery verwenden, können Sie jQuery.eachein Array durchlaufen. das würde so aussehen:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
jQuery.each(remSize, function(index, entry) {
    if (entry.size === remData.size) {
        remIndex = index;
        return false; // <== Equivalent of break for jQuery.each
    }
});

1
Die Verwendung der return-Anweisung ist ein guter Ansatz. Danke @TJ Crowder
techloris_109

@TJ Crowder Welche Aussage ist ein guter Ansatz: return false oder break?
Ilyas Karim

3
@Ilyaskarim: Sie verwenden das für das von Ihnen verwendete Konstrukt geeignete ( breakin einer forSchleife, return falsein jQuery.each, return truein some, ...).
TJ Crowder

13

Verwenden Sie stattdessen die for-Schleife, die Teil der ES2015-Version ist. Im Gegensatz zu forEach können wir return, break und continue verwenden. Siehe https://hacks.mozilla.org/2015/04/es6-in-depth-iterators-and-the-for-of-loop/

let arr = [1,2,3,4,5];
for (let ele of arr) {
  if (ele > 3) break;
  console.log(ele);
}

gute Verwendung von es6, ich denke, dies ist eine der besten Antworten hier
Emad Salah

In der Tat würde ich sagen, es ist DIE beste Antwort hier - die beste Art, dies zu tun ("die prägnanteste, direkteste Syntax, die bisher für das Durchlaufen von Array-Elementen verwendet wurde", wie Mozilla Hacks im Link in der Antwort sagt). Wir sollten all die harte Arbeit, die in ES6 steckt, zurückzahlen, indem wir die neuen Funktionen nutzen, wo immer wir können (und uns dabei selbst davon profitieren).
Velojet

10

Die Logik ist falsch. Es würde immer das Ergebnis des letzten Elements im Array zurückgeben.

remIndex = -1;

for (i = 0; i < remSize.length; i++) {      
    if (remSize[i].size == remData.size) {
        remIndex = i
        break;
    }
}

0

Ich weiß, dass dies ein bisschen alt ist, aber anstatt das Array mit einer for-Schleife zu durchlaufen, wäre es viel einfacher, die Methode zu verwenden <array>.indexOf(<element>[, fromIndex])

Es durchläuft ein Array und findet den ersten Index eines Werts. Wenn der Wert nicht im Array enthalten ist, wird -1 zurückgegeben.

<array>ist das zu durchsuchende Array, der gesuchte <element>Wert und [fromIndex]der Index, von dem aus begonnen werden soll (standardmäßig 0).

Ich hoffe, dies hilft, die Größe Ihres Codes zu reduzieren!


1
Dies schließt nicht die Titel Frage beantworten: How to stop a JavaScript for loop?Es tut Antwort Gibt es einen besseren Weg , um den Index eines Spiels / -1 , wenn keine zurückzukehren .
Graubart
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.