Qual é a melhor maneira de romper loops aninhados em Javascript?
//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.
}
}
}
}
javascript
loops
nested-loops
break
Gary Willoughby
fonte
fonte
Respostas:
Assim como Perl,
conforme definido na seção 12.12 da EMCA-262. [Documentos da MDN]
Ao contrário de C, esses rótulos só podem ser usados
continue
ebreak
, como o Javascript não possuigoto
.fonte
continue
ebreak
.Embrulhe isso em uma função e depois apenas
return
.fonte
Estou um pouco atrasado para a festa, mas a seguir é uma abordagem independente de idioma que não usa GOTO / labels ou quebra de função:
No lado positivo, flui naturalmente, o que deve agradar à multidão que não é da GOTO. Por outro lado, o loop interno precisa concluir a iteração atual antes de terminar, para que não seja aplicável em alguns cenários.
fonte
break
oucontinue
imediatamente após definir z e y? Eu gosto da idéia de usar asfor
condições do loop para começar. Elegante à sua maneira.Sei que esse é um tópico muito antigo, mas como minha abordagem padrão ainda não está aqui, pensei em publicá-la para os futuros googlers.
fonte
condition
avaliadotrue
na primeira iteração do loop aninhado, você ainda executará o restante das 10 iterações, verificando oabort
valor a cada vez. Este não é um problema de desempenho para 10 iterações, mas seria com, por exemplo, 10.000.abort
e a expressão. Em cenários simples que podem ser bons, mas para loops enormes com iterações com zilhões deComo é isso? :)
fonte
x
, se alguma lógica dentro do loop fizer referência a x em um momento posterior (por exemplo, ela define uma função anônima interna que é salva e executada posteriormente), o valor de x será o que for estava no final do loop, não o índice em que a função foi definida durante. (continuação)x
como um parâmetro para a sua função anônima para que ele cria uma nova cópia do mesmo, que pode então ser referenciado como um fechamento, uma vez que não vai mudar a partir desse ponto. Em suma, recomendo a resposta do epemiente.Bem simples:
fonte
loop1=loop2=false;
Aqui estão cinco maneiras de interromper os loops aninhados no JavaScript:
1) Defina o loop pai (s) até o final
2) Use etiqueta
3) Use variável
4) Use a função de execução automática
5) Use a função regular
fonte
break 2;
como a que temos no PHP. Sem rótulos de loop, sem funções, sem verificações if-else, sem moderação com / explosão de variáveis de loop - apenas sintaxe limpa!Que tal usar sem interrupções, sem sinalizadores de cancelamento e sem verificações extras de condição. Esta versão apenas explode as variáveis de loop (as cria
Number.MAX_VALUE
) quando a condição é atendida e força todos os loops a terminarem com elegância.Houve uma resposta semelhante para os loops aninhados do tipo decrementar, mas isso funciona para loops aninhados do tipo incrementador sem a necessidade de considerar o valor de terminação de cada loop para loops simples.
Outro exemplo:
fonte
Que tal empurrar loops para seus limites finais
fonte
Se você usa o Coffeescript, existe uma palavra-chave "do" conveniente que facilita a definição e a execução imediata de uma função anônima:
... para que você possa simplesmente usar "return" para sair dos loops.
fonte
for
loops e não dois.Eu pensei em mostrar uma abordagem de programação funcional. Você pode interromper as funções Array.prototype.some () e / ou Array.prototype.every () aninhadas, como nas minhas soluções. Um benefício adicional dessa abordagem é que
Object.keys()
enumera apenas as propriedades enumeráveis de um objeto, enquanto "um loop for-in também enumera propriedades na cadeia de protótipos" .Perto da solução do OP:
Solução que reduz a iteração sobre os títulos / itens:
fonte
Já mencionado anteriormente por swilliams , mas com um exemplo abaixo (Javascript):
fonte
Hmmm oi para a festa de 10 anos?
Por que não colocar alguma condição no seu para?
Assim você para quando quiser
No meu caso, usando o Typecript, podemos usar alguns () que passam pela matriz e param quando a condição é atendida. Portanto, meu código se torna assim:
Assim, o loop parou logo após a condição ser atendida
Lembrete: esse código é executado no TypeScript
fonte
fonte
a melhor maneira é -
1) Classifique a matriz que é usada no primeiro e no segundo loop.
2) se o item corresponder, quebre o loop interno e mantenha o valor do índice.
3) quando iniciar a próxima iteração, inicie o loop interno com o valor de índice de espera.
fonte