atrapar para cada última iteración

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

¿Cómo detectar cuándo termina el bucle? Puedo hacerlo, if(i == 3)pero es posible que no sepa cuál es el número de mi matriz.

Jamie Anderson
fuente

Respuestas:

173

La respuesta actualizada para ES6 + está aquí .


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

saldría:

Last callback call at index 2 with value 3

La forma en que esto funciona es probando arr.lengthcontra el índice actual de la matriz, pasado a la función de devolución de llamada .

jdphenix
fuente
Puedo respaldar eso, es un poco más claro, aunque no estoy seguro de que realmente garantice nada más, ya arrque ya está en el alcance como un cierre para cada devolución de llamada
jdphenix
e inmediatamente después de publicar eso, me di cuenta de un caso de uso obvio: si hubiera definido la devolución de llamada en otro lugar. Inserte cara de vergüenza.
jdphenix
no se necesita una cara avergonzada. Tenía esa pregunta exacta (¿Por qué necesita una matriz cuando tiene arr?), Pero su observación / pregunta lo aclaró, así que gracias. Aunque es extraño que usted mismo haya escrito esa respuesta y cuestione su propia respuesta. ¿Hay otros comentarios a los que estaba respondiendo que quizás ahora se hayan eliminado?
redfox05
@Russell Eso es correcto, hay (hubo) una discusión que desde entonces se ha eliminado parcialmente.
jdphenix
34

La RESPUESTA 2018 ES6 + ES :

    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
fuente
Me gusta más este hoy, aunque lo admitiré fácilmente incluso en 2015, declarar implícitamente que lo global era una mala idea.
jdphenix
1
No olvides que const y let no son declaraciones globales, ya que solo son válidas en el alcance inmediato ... a diferencia de var, que se eleva a la parte superior del método.
Sterling Bourne
Huhh ... La versión anterior es mucho más concisa y legible. Esto de Object es un desastre.
giorgio79
2
Solo es un desastre si no lo entiendes Giorgio79. Existen numerosos beneficios al usar Object.is () como su método principal de comparación versus == o ===. ¡Gracias por tu comentario!
Sterling Bourne
2
@SterlingBourne, ¿puede explicarnos con más detalle cuáles son esos beneficios? (Sería bueno incluir eso en la respuesta también)
ludovico
4
const arr= [1, 2, 3]
arr.forEach(function(element){
 if(arr[arr.length-1] === element){
  console.log("Last Element")
 }
})
Justin Coleman
fuente
2
Puede que no siempre funcione. let o = { val:"ue" } ; let arr = [ o, 1, o ]; ...Desafortunadamente, la primera iteración tendráarr[arr.length-1] === element
e2-e4