640 Stimmen

Was ist der beste Weg, um aus verschachtelten Schleifen in JavaScript zu brechen?

Was ist der beste Weg, um aus verschachtelten Schleifen in Javascript zu brechen?

//Write the links to the page.
for (var x = 0; x < Args.length; x++)
{
   for (var Heading in Navigation.Headings)
   {
      for (var Item in Navigation.Headings[Heading])
      {
         if (Args[x] == Navigation.Headings[Heading][Item].Name)
         {
            document.write("<a href=\"" 
               + Navigation.Headings[Heading][Item].URL + "\">" 
               + Navigation.Headings[Heading][Item].Name + "</a> : ");
            break; // <---HERE, I need to break out of two loops.
         }
      }
   }
}

0 Stimmen

Hier ist ein gutes Beispiel für den Ausbruch aus Schleifen und Codeblöcken: marcin-chwedczuk.github.io/

1468voto

ephemient Punkte 189038

Genau wie Perl,

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

wie in EMCA-262 Abschnitt 12.12 definiert. [MDN Docs]

Im Gegensatz zu C können diese Etiketten nur verwendet werden für continue y break da Javascript nicht über goto .

0 Stimmen

Interessant! Ich wusste nicht, dass man ein Etikett aufbrechen kann.

5 Stimmen

Ist es "brechen zu ein Etikett"? Es sieht eher so aus, als würden Sie einen Block mit n optional verschachtelten Schleifen darin benennen und dann das "Durchlaufen des Blocks" durch den Aufruf von break {label} abbrechen.

9 Stimmen

@NielsBom Sie haben recht: Die Schleife wird mit dem angegebenen Label verlassen. Er tut es nicht goto das Etikett. Sie benennen im Wesentlichen eine Schleife und sagen, ich möchte aus dieser Schleife ausbrechen.

237voto

swilliams Punkte 46488

Verpacken Sie das in eine Funktion und dann einfach return .

0 Stimmen

Ich bin nicht der Fragesteller, aber ich vermute, dass es einfach ist? ephemient's ist genauso gültig, obwohl ich solche Bezeichnungen syntaktisch nicht mag. Fühlt sich irgendwie wie GOTO an - obwohl ich diese Dose Würmer hier nicht öffnen möchte.

15 Stimmen

Ich entscheide mich für diese Antwort, weil sie einfach ist und auf elegante Weise umgesetzt werden kann. Ich hasse GOTOs absolut und halte sie für schlechte Praxis ( kann öffnen ), Ephemient's ist zu nah an einem. ;o)

18 Stimmen

IMO, GOTO's sind in Ordnung, solange sie die Strukturierung nicht unterbrechen. Aber jedem das Seine!

104voto

aleemb Punkte 29695

Ich bin zwar ein wenig spät dran, aber das Folgende ist ein sprachunabhängiger Ansatz, der weder GOTO/Labels noch Funktionsumbrüche verwendet:

for (var x = Set1.length; x > 0; x--)
{
   for (var y = Set2.length; y > 0; y--)
   {
      for (var z = Set3.length; z > 0; z--)
      {
          z = y = -1; // terminates second loop
          // z = y = x = -1; // terminate first loop
      }
   }
}

Positiv ist, dass es natürlich fließt, was die Nicht-GOTO-Leute freuen dürfte. Der Nachteil ist, dass die innere Schleife die aktuelle Iteration abschließen muss, bevor sie beendet wird, so dass sie in einigen Szenarien nicht anwendbar sein könnte.

3 Stimmen

Die öffnende geschweifte Klammer sollte nicht in neuen Zeilen stehen, da js-Implementierungen möglicherweise einen Doppelpunkt am Ende der vorangehenden Zeile einfügen.

27 Stimmen

@Evgeny: Während einige JavaScript-Style-Guides fordern, dass öffnende geschweifte Klammern in derselben Zeile stehen müssen, ist es nicht falsch, sie in einer neuen Zeile zu platzieren, und es besteht keine Gefahr, dass der Interpreter mehrdeutig ein Semikolon einfügt. Das Verhalten von ASI ist klar definiert und trifft hier nicht zu.

11 Stimmen

Vergewissern Sie sich nur, dass Sie diesen Ansatz nicht kommentieren. Es ist nicht sofort ersichtlich, was hier vor sich geht.

88voto

zord Punkte 4345

Ich weiß, dass dies ein sehr altes Thema ist, aber da mein Standardansatz hier noch nicht zu finden ist, dachte ich, ich poste es für die zukünftigen Googler.

var a, b, abort = false;
for (a = 0; a < 10 && !abort; a++) {
    for (b = 0; b < 10 && !abort; b++) {
        if (condition) {
            doSomeThing();
            abort = true;
        }
    }
}

2 Stimmen

Wenn die condition wertet aus zu true bei der ersten Iteration der verschachtelten Schleife, durchlaufen Sie trotzdem die restlichen 10 Iterationen und überprüfen die abort Wert jedes Mal. Bei 10 Iterationen stellt dies kein Leistungsproblem dar, wohl aber bei 10.000 Iterationen.

9 Stimmen

Nein, er verlässt beide Schleifen. Hier ist die Demonstration fiddle . Unabhängig von der eingestellten Bedingung wird sie beendet, wenn sie erfüllt ist.

7 Stimmen

Eine Optimierung wäre das Hinzufügen eines break; nach dem Setzen von abort = true; und das Entfernen der !abort-Bedingungsprüfung aus der letzten Schleife.

66voto

Das ist ganz einfach:

var a = [1, 2, 3];
var b = [4, 5, 6];
var breakCheck1 = false;

for (var i in a) {
    for (var j in b) {
        breakCheck1 = true;
        break;
    }
    if (breakCheck1) break;
}

1 Stimmen

Ich stimme zu, dies ist eigentlich die beste, Funktion eine nicht skalieren, wickeln alle for-Schleifen in wenn auch nicht skalieren, d.h. macht es schwer zu lesen und debuggen....dies ist genial. Sie können einfach vars loop1, loop2, loop3 deklarieren und eine kleine Anweisung am Ende hinzufügen. Auch um mehrere Schleifen zu unterbrechen, müsste man etwas tun wie loop1=loop2=false;

1 Stimmen

Ich habe diese Anordnung verwendet, und sie funktioniert, ohne sie durch unnötige Funktionen zu verkomplizieren. Ich kam nur hier nach der Suche nach etwas zu sehen, wenn js hat break 2; wie in php.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X