Como pular para a próxima iteração no jQuery.each () util?

434

Estou tentando iterar através de uma matriz de elementos. A documentação do jQuery diz:

Documentação de jquery.Each ()

Retornar não-falso é o mesmo que uma instrução continue em um loop for, ele irá pular imediatamente para a próxima iteração.

Eu tentei chamar 'return non-false;' e 'não falso'; (sans return), nenhum dos quais pula para a próxima iteração. Em vez disso, eles quebram o ciclo. O que estou perdendo?

Josh
fonte
9
Em sua infinita sabedoria, os bods do jQuery agora removeram esta nota da documentação - ou pelo menos, ela não está na página de cada () . Então, eu estou muito feliz de ver esta questão ainda pode ser encontrado aqui no SO, e por extensão no Google, já que esta é uma daquelas coisas simples que eu sempre esqueço :)
Doug McLean

Respostas:

783

O que eles querem dizer com não-falso é:

return true;

Portanto, este código:

var arr = ["one", "two", "three", "four", "five"];
$.each(arr, function(i) {
  if (arr[i] == 'three') {
    return true;
  }
  console.log(arr[i]);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

registrará one, two, four, five.

Paolo Bergantino
fonte
16
Para sair apenas da iteração atual, basta retornar 'return'. E para sair de todas as iterações para frente, retorne false.
Saulius
7
Vale dizer que isso funciona porque você está dentro de uma função quando esse código é executado.
precisa saber é o seguinte
quando eu retornar (arr [i] === 'três'); por que não está funcionando ??
ajayv
Para mim, não-falso significa, você pode retornar qualquer coisa, exceto retornar falso;
Hoang Trung
61

Por 'retornar não-falso', eles significam retornar qualquer valor que não funcionaria como booleano false. Então você poderia voltar true, 1, 'non-false'ou qualquer outra coisa que você pode pensar-se.

TJ L
fonte
20
por que não apenas explicitamente, para "retornar 'continuar';"
Alexander Mills
que tal continuar ;? que trabalhou em uma variação de C sharp eu trabalhei com então eu só estou supondo que teria um efeito similar em JS
Brandito
@Brandito Não está funcionando como um loop normal - está chamando uma função recursivamente, portanto, para que o loop continue, é necessário finalizar o processamento dentro da função.
TJ L
5

O tipo de Javascript tem a idéia de 'veracidade' e 'falsidade'. Se uma variável tem um valor então, geralmente 9 como você verá) ela tem 'veracidade' - nula ou nenhum valor tende a 'falsidade'. Os trechos abaixo podem ajudar:

var temp1; 
if ( temp1 )...  // false

var temp2 = true;
if ( temp2 )...  // true

var temp3 = "";
if ( temp3 ).... // false

var temp4 = "hello world";
if ( temp4 )...  // true

Espero que ajude?

Além disso, vale a pena conferir esses vídeos de Douglas Crockford

update: obrigado @cphpython por detectar os links quebrados - atualizei para apontar para as versões de trabalho agora

A linguagem Javascript

Javascript - As boas partes

mlennox
fonte
1
Os links estão quebrados ... Aliás, 0também é um valor falso e a negação é verdadeira (e vice-versa para qualquer outro número, por exemplo !-42 === false).
precisa saber é o seguinte
4

Não se esqueça de que às vezes você pode cair do final do bloco para chegar à próxima iteração:

$(".row").each( function() {
    if ( ! leaveTheLoop ) {
        ... do stuff here ...
    }
});

Em vez de realmente retornar assim:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});
Lee Meador
fonte
3
Não quero ser rude, mas esse é um design dolorosamente horrível. Quero dizer ... eu fiz isso nos meus 2 primeiros anos de faculdade, quando eu não conhecia melhor (mesmo assim não gostava), mas não é algo que deva ser
aconselhado
@ DanielParejoMuñoz, eu ouvi você, mas discordamos. A escolha de não ter uma declaração de retorno pode não ser algo que você goste. Mas eu diria que é uma coisa de gostar / não gostar, em vez de uma coisa boa / ruim. Nenhum dos dois possui vantagens objetivas.
Lee Meador 26/02
4
isto tem a desvantagem de aumentar a nidificação
Dave Cousineau
3

O loop só será interrompido se você retornar literalmente false. Ex:

// this is how jquery calls your function
// notice hard comparison (===) against false
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
   break;
}

Isso significa que você pode retornar qualquer outra coisa, inclusive undefined, que é o que você devolve se não devolver nada; portanto, você pode simplesmente usar uma declaração de retorno vazia:

$.each(collection, function (index, item) {
   if (!someTestCondition)
      return; // go to next iteration

   // otherwise do something
});

É possível que isso possa variar de acordo com a versão; isso é aplicável ao jquery 1.12.4. Mas, realmente, quando você sai da parte inferior da função, você também não está retornando nada, e é por isso que o loop continua, então eu esperaria que não houvesse nenhuma possibilidade de que retornar nada não pudesse continuar o loop. A menos que desejem forçar todo mundo a começar a devolver algo para manter o ciclo funcionando, nada deve ser uma maneira de mantê-lo funcionando.

Dave Cousineau
fonte
-3

jQuery.noop () pode ajudar

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});
melaxon
fonte
Não, essa função noop () não ajuda em nada. Funciona apenas porque o bloco "else" não está ativado.
Rauni Lillemets