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.

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 .


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}` ); 
      }
    });

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.