Wie unterbreche ich verschachtelte Schleifen in JavaScript? [duplicate]

Lesezeit: 3 Minuten

Wie unterbreche ich verschachtelte Schleifen in JavaScript duplicate
Maske

Ich habe das versucht:

for(i = 0; i < 5; i++){
    for(j = i + 1; j < 5; j++){
        break(2);
    }
    alert(1);
}

nur zu bekommen:

SyntaxError: fehlen ; vor Aussage

Wie würde ich also eine verschachtelte Schleife in JavaScript unterbrechen?

  • Pause (2) ; 😮 was meinst du damit 2break kann keine Argumente haben

    – Rakesh Juyal

    14. Oktober 2009 um 7:51 Uhr

  • Zeile 7 fehlt ein Semikolon danach alert(1).

    – Nathan Taylor

    14. Oktober 2009 um 8:18 Uhr

  • @Nathan Taylor: Semikolons sind in JavaScript optional, gelten aber als guter Stil

    – Tim Büthe

    14. Oktober 2009 um 8:41 Uhr

  • Nahezu Duplikat von stackoverflow.com/q/183161/149391

    – Joey Adams

    13. Juni 2012 um 9:57 Uhr

  • @RakeshJuyal tut es in anderen Sprachen wie C

    – Masadow

    4. Februar 2015 um 10:11 Uhr

Wie unterbreche ich verschachtelte Schleifen in JavaScript duplicate
Mittag Seide

Sie sollten in der Lage sein, zu einem Label zu wechseln, etwa so:

function foo () {
    dance:
    for (var k = 0; k < 4; k++) {
        for (var m = 0; m < 4; m++) {
            if (m == 2) {
                break dance;
            }
        }
    }
}

  • Breakdance har har

    – ahnbizcad

    13. Mai 2020 um 2:36 Uhr

  • Es gibt auch die Tatsache, dass JS diesen Giganten benötigt tanzen. Andere Sprachen geben Ihnen a break (wörtlich, wie break 2).

    – i336_

    16. März 2021 um 5:00 Uhr

  • Wäre es dasselbe, wenn dance: war nach dem for? Oder muss das Etikett vorher gelesen werden break?

    – agiopnl

    16. Januar um 19:17 Uhr


Sie müssen Ihre äußere Schleife benennen und diese Schleife brechen, anstatt Ihre innere Schleife – so.

outer_loop: 
for(i=0;i<5;i++) {
    for(j=i+1;j<5;j++) {
        break outer_loop;
    }
    alert(1);
}

  • Wow, ich wusste nicht, dass wir Loops benennen können, tolle Info! +1

    – OK W

    14. Oktober 2009 um 7:53 Uhr

  • @okw: Sie benennen die Schleife nicht. Sie beschriften einfach eine Position in der Quelle.

    – xtofl

    14. Oktober 2009 um 8:02 Uhr

  • Ich wusste nie, dass JavaScript unterstützte Labels. Ich frage mich, warum ich das noch nie gesehen habe. :Ö

    – Nathan Taylor

    14. Oktober 2009 um 8:19 Uhr

  • @xtofl: Nicht genau. Sie assoziieren eine Bezeichnung mit einer Anweisung (die eine Schleife sein könnte), indem Sie sie unmittelbar davor platzieren. Es ist nur mit einer Blockanweisung sinnvoll, da das Label nur mit den Break- und Continue-Anweisungen innerhalb des Blocks verfügbar ist.

    – Tim unten

    14. Oktober 2009 um 8:48 Uhr

  • @NickFitz: Sie könnten ein Leistungsargument dafür anführen. Im Fall von verschachtelten Schleifen könnten Etiketten nützlich sein, um aus einer äußeren Schleife auszubrechen. Während es eleganter und modularer sein kann, verschachtelte Schleifen zu vermeiden, indem innere Schleifen in separate Funktionen verschoben werden, wird es aufgrund der zusätzlichen Funktionsaufrufe geringfügig langsamer ausgeführt.

    – Tim unten

    14. Oktober 2009 um 10:39 Uhr

Siehe Aarons. Andernfalls:
j=5;i=5 anstatt break.

  • Das ist einfach die beste und sauberste Lösung. Verwenden Sie keine Etiketten mehr, sie sehen schrecklich aus.

    – Pedro Moreira

    7. August 2014 um 21:09 Uhr


  • Das ist hässlich. for(i=0;i<5;i++) soll 5 mal laufen. Aktualisierung i außerhalb der Loop-Anweisung führt zu einem unerwarteten Verhalten.

    – FlorianF

    12. November 2014 um 8:34 Uhr


  • Hässlich ist subjektiv. Die Schleife soll so oft ausgeführt werden, wie Sie möchten. Die Frage war, wie man eine doppelte For-Schleife durchbricht, in der weder j noch i bis 5 laufen. Der einzige technische Grund für die Bevorzugung von mine vs ) vs. Unvollständigkeit (== <5) nach Schleifen.

    – Glenn

    12. November 2014 um 21:52 Uhr

  • Stimmen Sie @FlorianF zu, das ist hässlich in dem Sinne, dass es eine fehleranfälligere Lösung zu sein scheint als das Hinzufügen eines Labels, obwohl ich dafür keine statistischen Beweise habe. Ob Sie an Etiketten gewöhnt sind oder nicht, sie sind sicherlich kein fehlerfreies Konzept, aber harte Codierungsnummern, die Sie an mehreren Stellen ändern müssen, wenn sich eine ändert, ist ein schrecklicher Programmierstil. In Bezug auf die Bewertung ist dies eine faire Aussage und hilfreich, um die beste Antwort für das OP zu ermitteln.

    – Manuel

    24. April 2020 um 20:17 Uhr


  • @Manuel: re: “schrecklicher Programmierstil”. Es steht Ihnen frei, consts usw. für die Zahlen an beiden Stellen zu verwenden, aber das ist für die Frage nicht relevant. Da dies 2009 beantwortet wurde, würde ich heute sagen, dass Sie Ihren Code neu schreiben sollten, damit Sie keine for-Schleife verwenden müssen. (Filtern, Reduzieren, Zuordnen usw.)

    – Glenn

    28. April 2020 um 1:56 Uhr

1645662916 632 Wie unterbreche ich verschachtelte Schleifen in JavaScript duplicate
Dan Bray

Es gibt mindestens fünf verschiedene Möglichkeiten, aus zwei oder mehr Schleifen auszubrechen:

1) Legen Sie die übergeordnete Schleife bis zum Ende fest

for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
        {
            i = 5;
            break;
        }
    }
}

2) Etikett verwenden

fast:
for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
            break fast;
    }
}

3) Variable verwenden

var exit_loops = false;
for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
        {
            exit_loops = true;
            break;
        }
    }
    if (exit_loops)
        break;
}

4) Verwenden Sie die selbstausführende Funktion

(function()
{
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
             if (j === 2)
                 return;
        }
    }
})();

5) Verwenden Sie die reguläre Funktion

function nested_loops()
{
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
             if (j === 2)
                 return;
        }
    }
}
nested_loops();

1645662917 166 Wie unterbreche ich verschachtelte Schleifen in JavaScript duplicate
Jim

loop1:
    for (var i in set1) {
loop2:
        for (var j in set2) {
loop3:
            for (var k in set3) {
                break loop2;  // breaks out of loop3 and loop2
            }
        }
    }

Code kopiert von Der beste Weg, um verschachtelte Schleifen in Javascript zu brechen?

Bitte suchen Sie, bevor Sie eine Frage stellen. Der Link war die ERSTE verwandte Frage, die ich auf der linken Seite dieser Seite gesehen habe!

1645662917 108 Wie unterbreche ich verschachtelte Schleifen in JavaScript duplicate
Nicolás Ozimica

Leider müssen Sie ein Flag setzen oder Labels verwenden (denken Sie an goto-Anweisungen der alten Schule).

var breakout = false;

for(i=0;i<5;i++)
{
    for(j=i+1;j<5;j++)
    {
        breakout = true;
        break;
    }
    if (breakout) break;
    alert(1)
};

Der Label-Ansatz sieht folgendermaßen aus:

end_loops:
for(i=0;i<5;i++)
{
    for(j=i+1;j<5;j++)
    {
        break end_loops;
    }
    alert(1)
};

edit: Beschriftung falsch platziert.

siehe auch:

Meiner Meinung nach ist es wichtig, den Konstruktwortschatz auf ein Minimum zu beschränken. Wenn ich auf Pausen und Fortsetzungen verzichten kann, tue ich das.

function foo ()
{
    var found = false;
    for(var k = 0; (k < 4 && !found); k++){
        for(var m = 0; (m < 4 && !found); m++){
           if( m === 2){
               found = true;
           }
        }
    }
    return found;
}

Seien Sie gewarnt, nach der Schleife sind m und k um eins größer, als Sie vielleicht denken. Dies liegt daran, dass m++ und k++ vor ihren Schleifenbedingungen ausgeführt werden. Es ist jedoch immer noch besser als “schmutzige” Pausen.

EDIT: langer Kommentar @Dennis…

Ich habe es nicht 100% ernst gemeint, „schmutzig“ zu sein, aber ich denke immer noch, dass „Break“ meiner eigenen Vorstellung von sauberem Code widerspricht. Bei dem Gedanken an mehrstufige Pausen bekomme ich tatsächlich Lust zu duschen.

Ich finde rechtfertigend, was ich mit einem Gefühl für Code meine, weil ich mein ganzes Leben lang codiert habe. Der beste Grund, warum ich mir vorstellen kann, ist eine Kombination aus Manieren und Grammatik. Pausen sind einfach nicht höflich. Mehrstufige Pausen sind einfach nur unhöflich.

Beim Betrachten einer for-Anweisung weiß ein Leser genau, wo er suchen muss. Alles, was Sie über die Einsatzregeln wissen müssen, steht im Vertrag zwischen den Klammern. Als Leser beleidigen mich Pausen, es fühlt sich an, als wäre ich betrogen worden.

Klarheit ist viel respektvoller als Betrug.

  • Warum sollten Sie Ihr Konstruktvokabular auf ein Minimum beschränken? Das Argument, Pausen seien „schmutzig“, ist absurd. In Bezug auf die Lesbarkeit ist Ihre Lösung viel schlechter und schneidet nicht besser ab. Sie haben jedoch einen Punkt, wie jedes Konstrukt, Pausen können missbraucht werden, aber ein bisschen Schummeln hier oder da aus Gründen der Lesbarkeit ist definitiv in Ordnung.

    – Denis

    10. Juli 2012 um 21:41 Uhr

  • zu lang, um in einen Kommentar zu passen, den ich bearbeitet habe.

    – Thomas Peter

    13. Juli 2012 um 12:06 Uhr

  • Auch das Konstruktvokabular auf ein Minimum zu beschränken, ist eher ein Ergebnis des häufigen Wechsels zwischen vielen Sprachen. Sie neigen dazu, mehr Sprache zu verwenden, die zwischen ihnen üblich ist. Im Fall von JavaScript hat dies den Vorteil, dass der Code systemübergreifend kompatibel ist, und kommt auch Lesern zugute, die JavaScript möglicherweise nicht als ihre Hauptsprache verwenden.

    – Thomas Peter

    13. Juli 2012 um 12:37 Uhr

  • +1 für einen anderen Ansatz. Es ist gut, Optionen zu haben

    – Phil Stark

    30. August 2012 um 12:17 Uhr

  • Das Hinzufügen des Tests in zwei Schleifen verursacht mit größerer Wahrscheinlichkeit Fehler als ein break oder continue. In diesem Fall können Sie einfach zurückkehren, wenn Sie eine Übereinstimmung finden

    – Juan Mendes

    29. Dezember 2012 um 1:05 Uhr


838770cookie-checkWie unterbreche ich verschachtelte Schleifen in JavaScript? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy