2009-09-09 14 views
18
var arr = {'a':fn1,'b':fn2,'c':fn3} 

$.each(arr,function(name,func){ 
(do something particular for the last iteration) 
... 
}) 

Será mejor si no se utilizan variables adicionales.

EDITAR: me refiero literalmente última, que es la última pareja que se escriben.

+1

¿Por qué lo que necesita saber cuando es el último elemento? Tal vez hay una solución más simple. – Gumbo

+5

Tenga en cuenta que su 'arr' es un objeto y los miembros del objeto en JavaScript no tienen un orden garantizado. Entonces, de hecho, no hay un "último" elemento. – Fabian

+0

@ Fabian Neumann, ¿puedes probar eso? – omg

Respuesta

32

Su variable de ejemplo se llama 'arr', pero no es una matriz en absoluto (es un objeto). Esto lo hace un poco confuso.

Al iterar sobre un objeto, no existe la "última" propiedad, porque el orden de las propiedades no está definido por el diseño.

Al iterar sobre una matriz, puede simplemente comparar el primer parámetro de la devolución de llamada con (array.length-1) para detectar la última iteración.

en el código (para las matrices):

var arr = [ "a","b","c" ]; 

$.each(arr, function(i,val) { if (i == arr.length-1) ... }); 
+0

¿Puedes "decirlo" en el código? – omg

+0

¿Por qué se ha votado? – rahul

+0

También me pregunto ... –

4

Philippe respuesta de Leybaert se describen los problemas con su pregunta muy bien, y es probable que haya una manera más clara de lo que quiere hacer. Pero dicho esto, no veo una manera de hacer lo que me pides sin usar una variable adicional.

var obj = { 'a': fn1, 'b': fn2, 'c': fn3 }; 
var lastKey; 

$.each(obj, function(key, fn) { 
    // do stuff... 
    lastKey = key; 
}); 

obj[lastKey].doStuffForLastIteration(); 
-2

Ahora que he visto tu duplicate question - donde estado "para lo siguiente, que es 'c': na3" - parece que es posible que después de que el valor de la máxima propiedad de un objeto.

var obj = { 'a': fn1, 'b': fn2, 'c': fn3 }; 

var maxKey; 
for (var key in arr) { 
    if (!(maxKey > key)) { 
     maxKey = key; 
    } 
} 

// fn will be fn3 
var fn = obj[maxKey]; 
1

Si necesita algo suceda, que usted está interactuando sobre una sola lista y que querían otro objeto para ser insertado de forma condicional, pero si no se cumple la condición que lo necesitan para ser utilizado por última vez, se puede hacer algo como:

$list = $({{some_selector}}); 
$list_elt = $({{some_html}}) 
$list.each(function (i) { 
    if ({{condition is met}}) { 
     $(this).before($list_elt); 
     return false; 
    } 
    else if (i == $list.length - 1) { 
     $(this).after($list_elt); 
     return false; 
    } 
}); 

que es lo mismo que la solución de Philippe, realmente. Si hay alguna razón por la cual esto no debería funcionar, por favor coméntenlo y háganmelo saber, porque lo uso.

-2

Siendo jQuery.each función syncronous, ¿realmente necesita seguir la última iteración? Simplemente ponga su código después de la llamada $.each().

+1

Las cosas que se hacen dentro de cada una no pueden ... – Dan

+0

¿Qué pasa si hay una llamada Ajax dentro del '$ .each' es asíncrona –

+0

@Reddy Acabo de introducir una respuesta mejorada, échale un vistazo http://stackoverflow.com/ preguntas/1399004/how-to-catch-last-iteration-inside-each-in-jquery/33016252 # 33016252 – balanza

0

Aquí propongo una respuesta nueva y mejorada.

Una manera elegante podría ser utilizar una envoltura de función after(). Aquí está el código:

function after(fn, times){ 
    return function(){ 
    if(--times === 0){ 
     var args = Array.prototype.slice.call(arguments); 
     fn.apply(this, args); 
    } 
    }; 
} 

fn es la función que desea ser ejecutado por fin, times es el número de diferentes respuestas que está esperando.

after() envuelve su función y crea una nueva función que ejecuta su código solo después de times llamadas.He aquí un ejemplo en breve:

function onLastResponse(foo){ 
    console.log('this is last iteration'); 
} 

var myCallback = after(onLastResponse, 3); 

myCallback(); //not executed 
myCallback(); //not executed 
myCallback(); //executed 

Marque esta jsbin para un ejemplo vivo: https://jsbin.com/sufaqowumo/edit?js,console