(Atualização: Minha outra resposta aqui apresenta as opções que não são do jQuery jQuery.each
.
Quatro opções:
Loop genérico:
var i;
for (i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
ou no ES2015 +:
for (let i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
Vantagens : Direto, sem dependência do jQuery, fácil de entender, sem problemas com a preservação do significado do this
corpo do loop, sem sobrecarga desnecessária de chamadas de função (por exemplo, em teoria mais rapidamente, embora na verdade você precise tem tantos elementos que as chances são de que você teria outros problemas; detalhes ).
ES5 forEach
:
No ECMAScript5, as matrizes têm uma forEach
função que facilita o loop pela matriz:
substr.forEach(function(item) {
// do something with `item`
});
Link para documentos
(Nota: existem muitas outras funções, não apenas forEach
; consulte a resposta mencionada acima para obter detalhes.)
Vantagens : Declarativa, você pode usar uma função pré-construída para o iterador, se você tiver uma útil, se o corpo do seu loop for complexo, o escopo de uma chamada de função às vezes é útil, sem necessidade de uma i
variável no seu escopo.
Desvantagens : Se você estiver usando this
no código que contém e que deseja usar this
dentro de seu forEach
retorno, você tem que quer A) Cole-o em uma variável de modo que você pode usá-lo dentro da função, B) Passe-o como um segundo argumento para forEach
assim forEach
define como this
durante o retorno de chamada, ou C) Use uma função de seta ES2015 + , que fecha this
. Se você não fizer uma dessas coisas, o retorno de chamada this
será undefined
(no modo estrito) ou o objeto global ( window
) no modo frouxo. Costumava haver uma segunda desvantagem que forEach
não era universalmente suportada, mas aqui em 2018, o único navegador em que você se depara que não possui forEach
é o IE8 (e não pode ser adequadamente lá também).
ES2015 + for-of
:
for (const s of substr) { // Or `let` if you want to modify it in the loop body
// do something with `s`
}
Veja a resposta vinculada na parte superior desta resposta para obter detalhes sobre como isso funciona.
Vantagens : Simples, direto, oferece uma variável de escopo contido (ou constante, acima) para a entrada da matriz.
Desvantagens : Não suportado em nenhuma versão do IE.
jQuery.each:
jQuery.each(substr, function(index, item) {
// do something with `item` (or `this` is also `item` if you like)
});
( Link para documentos )
Vantagens : Todas as mesmas vantagens que forEach
, além de você saber que existe desde que você está usando o jQuery.
Desvantagens : Se você estiver usando this
o código que contém, precisará inseri-lo em uma variável para poder usá-lo dentro da função, pois this
significa algo mais dentro da função.
Você pode evitar this
isso, usando $.proxy
:
jQuery.each(substr, $.proxy(function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}, this));
... ou Function#bind
:
jQuery.each(substr, function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}.bind(this));
... ou no ES2015 ("ES6"), uma função de seta:
jQuery.each(substr, (index, item) => {
// do something with `item` (`this` is the same as it was outside)
});
O que NÃO fazer:
Não use for..in
para isso (ou, se o fizer, faça-o com as devidas salvaguardas). Você verá pessoas dizendo (de fato, brevemente houve uma resposta aqui dizendo isso), mas for..in
não faz o que muitas pessoas pensam que faz (faz algo ainda mais útil!). Especificamente, for..in
percorre os nomes de propriedades enumeráveis de um objeto (não os índices de uma matriz). Como matrizes são objetos e suas únicas propriedades enumeráveis, por padrão, são os índices, geralmente parece que funciona em uma implantação branda. Mas não é uma suposição segura de que você pode usá-lo para isso. Aqui está uma exploração: http://jsbin.com/exohi/3
Eu deveria suavizar o "não" acima. Se você estiver lidando com matrizes esparsas (por exemplo, a matriz possui 15 elementos no total, mas seus índices estão espalhados pelo intervalo de 0 a 150.000 por algum motivo, e por isso length
é 150.001), e se você usar salvaguardas apropriadas como hasOwnProperty
e verificar as O nome da propriedade é realmente numérico (veja o link acima), for..in
pode ser uma maneira perfeitamente razoável de evitar muitos loops desnecessários, pois apenas os índices preenchidos serão enumerados.
.each()
oufor...in
fazer um loop sobre uma matriz geralmente é uma má idéia. É como idades mais lentas do que usarfor
ouwhile
. Usando umfor loop
, é uma ótima idéia armazenar em cache alength
propriedade antes de executar o loop.for (var i = 0, len = substr.length; i < len; ...
Function#bind
. :-) Bom ponto, acrescentou.i++
e++i
é o resultado dessa expressão, que nunca é usada no exemplo acima. Umfor
loop funciona assim: 1. Inicialização, 2. Teste (encerra se falso), 3. Corpo, 4. Atualização, 5. Retorne à Etapa 2. O resultado da expressão de atualização não é usado para nada.jQuery.each ()
jQuery.each ()
iteração de matriz
iteração de objeto
exemplo :
loops de javascript para matriz
para laço
exemplo
para em
para de
para cada
Recursos
Loops e iteradores MDN
fonte
Não há necessidade de jquery aqui, apenas um
for
loop funciona:fonte
Opção 1: O
for
laço tradicionalO básico
Um
for
loop tradicional possui três componentes:Esses três componentes são separados um do outro por um
;
símbolo. O conteúdo de cada um desses três componentes é opcional, o que significa que o seguinte é ofor
loop mínimo possível:Obviamente, você precisará incluir um
if(condition === true) { break; }
ou um localif(condition === true) { return; }
dentro dessefor
loop para que ele pare de funcionar.Geralmente, porém, a inicialização é usada para declarar um índice, a condição é usada para comparar esse índice com um valor mínimo ou máximo, e a reflexão posterior é usada para incrementar o índice:
Usando um
for
laço tradicional para percorrer uma matrizA maneira tradicional de fazer um loop através de uma matriz é esta:
Ou, se você preferir fazer um loop para trás, faça o seguinte:
Existem, no entanto, muitas variações possíveis, como por exemplo. este :
... ou este ...
... ou este:
O que funcionar melhor é em grande parte uma questão de gosto pessoal e do caso de uso específico que você está implementando.
Nota :Cada uma dessas variações é suportada por todos os navegadores, incluindo vários antigos!
Opção 2: O
while
loopUma alternativa para um
Nota :for
loop é umwhile
loop. Para percorrer uma matriz, você pode fazer o seguinte:Como os tradicionais
for
loops, oswhile
loops são suportados até pelos navegadores mais antigos.Além disso, o loop while pode ser reescrito como um loop
for
. Por exemplo, owhile
loop acima se comporta exatamente da mesma maneira que estefor
loop:Opção 3:
for...in
efor...of
Em JavaScript, você também pode fazer isso:
No entanto, isso deve ser usado com cuidado, pois não se comporta da mesma forma que um
for
laço tradicional em todos os casos, e existem possíveis efeitos colaterais que precisam ser considerados. Consulte Por que usar "for ... in" com iteração de matriz é uma má idéia? para mais detalhes.Como alternativa
Nota :for...in
, agora também existefor...of
. O exemplo a seguir mostra a diferença entre umfor...of
loop e umfor...in
loop:Você também precisa considerar que nenhuma versão do Internet Explorer suporta
for...of
( Edge 12+ ) e quefor...in
requer pelo menos o IE10.Opção 4:
Array.prototype.forEach()
Uma alternativa para
Nota :For
-loops éArray.prototype.forEach()
, que usa a seguinte sintaxe:Array.prototype.forEach()
é suportado por todos os navegadores modernos, bem como pelo IE9 +.Opção 5:
jQuery.each()
Além das quatro outras opções mencionadas, o jQuery também teve sua própria
foreach
variação.Ele usa a seguinte sintaxe:
fonte
Use a
each()
função do jQuery.Aqui está um exemplo:
fonte
Use jQuery
each()
. Existem outras maneiras, mas cada uma delas foi projetada para esse fim.E não coloque a vírgula após o último número.
fonte
Você pode usar um
for()
loop:fonte
Sintaxe ES6 com função de seta e interpolação:
fonte
Tente o seguinte:
fonte
Maneiras alternativas de iteração através de array / string com efeitos colaterais
fonte