pegar para cada última iteração

97
arr = [1,2,3];
arr.forEach(function(i){
// last iteration
});

Como pegar quando o loop termina? Eu posso fazer, if(i == 3)mas posso não saber qual é o número do meu array.

Jamie Anderson
fonte

Respostas:

179

A resposta atualizada para ES6 + está aqui .


arr = [1, 2, 3]; 

arr.forEach(function(i, idx, array){
   if (idx === array.length - 1){ 
       console.log("Last callback call at index " + idx + " with value " + i ); 
   }
});

produziria:

Last callback call at index 2 with value 3

A maneira como isso funciona é testando arr.lengthcontra o índice atual do array, passado para a função de retorno de chamada .

jdphenix
fonte
Posso esclarecer isso, é um pouco mais claro, embora não tenha certeza de que realmente garanta algo mais, uma vez que arrjá está no escopo como um encerramento para cada retorno de chamada
jdphenix
e imediatamente após postar que percebi um caso de uso óbvio - se você tivesse definido o retorno de chamada em outro lugar. Insira o rosto envergonhado.
jdphenix de
sem necessidade de rosto envergonhado. Eu tinha essa pergunta exata (por que você precisa do array quando você chegou), mas sua observação / pergunta esclareceu isso, então, obrigado. Embora seja estranho que você mesmo tenha escrito essa resposta e questione sua própria resposta? Há outros comentários aos quais você estava respondendo que talvez tenham sido excluídos?
redfox05
@Russell Correto, há (havia) uma discussão que foi parcialmente removida.
jdphenix de
33

A RESPOSTA ES6 + 2018 É :

    const arr = [1, 2, 3];

    arr.forEach((val, key, arr) => {
      if (Object.is(arr.length - 1, key)) {
        // execute last item logic
        console.log(`Last callback call at index ${key} with value ${val}` ); 
      }
    });
Sterling Bourne
fonte
1
Não se esqueça de que const e let não são declarações globais, pois são válidos apenas no escopo imediato ... ao contrário de var, que é içado para o topo do método.
Sterling Bourne
1
Huhh ... A versão anterior é muito mais concisa e legível. Esse negócio de Object é uma bagunça.
giorgio79
2
Só é uma bagunça se você não entende Giorgio79. Existem inúmeros benefícios em usar Object.is () como seu método principal de comparação contra == ou ===. Obrigado pelo seu comentário, no entanto!
Sterling Bourne
3
@SterlingBourne você pode explicar melhor quais são esses benefícios? (Seria bom incluir isso na resposta também)
ludovico
1
Usar Object.ispara algo tão simples como soar dois inteiros (que não podem nem ser -0 ou NaN) é definitivamente confuso. Diga-me, @SterlingBourne, quais são os benefícios?
Gust van de Wal
4
const arr= [1, 2, 3]
arr.forEach(function(element){
 if(arr[arr.length-1] === element){
  console.log("Last Element")
 }
})
Justin Coleman
fonte
4
Pode nem sempre funcionar. let o = { val:"ue" } ; let arr = [ o, 1, o ]; ...infelizmente, a primeira iteração teráarr[arr.length-1] === element
e2-e4