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

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

Va a ser mejor si no hay variables adicionales que se utilizan.

EDITAR:
Me refiero a LITERALMENTE último,que es el último par me escriba ellos.

  • Por qué usted necesita saber cuando es el último elemento? Tal vez hay una solución más sencilla.
  • Tenga en cuenta que su arr es un objeto y a miembros de objetos en JavaScript no tiene un orden garantizado. Así que en realidad no hay «último elemento».
  • Neumann ,se puede demostrar que?
  • ¿Por qué él tiene que demostrar algo que en las especificaciones de javascript? De acuerdo a las especificaciones, literalmente: «La mecánica de la enumeración de las propiedades dependientes de la implementación. El orden de enumeración se define por el objeto».
  • Leybaert: yo diría que esa es la «prueba» de la OP estaba buscando – una llamada para citación, más bien.
  • No me refiero a la conceptualmente último,pero literalmente último,pueden ustedes entender?
  • No hay manera de saber eso. El compilador de javascript/intérprete es libre de volver a las propiedades en cualquier orden que le plazca. Eso es lo que las especificaciones dicen, y no hay mucho que usted puede hacer acerca de eso.
  • Pero para un objeto fijo,al hacer $.cada uno,el orden es fijo, ¿verdad?
  • No, no es. Es indefinido, para cualquier objeto, sin importar cómo fue creado.

InformationsquelleAutor omg | 2009-09-09

6 Comentarios

  1. 33

    Su ejemplo de variable se llama ‘arr’, pero no es una matriz en la que todos (es un objeto). Esto hace que sea un poco confuso.

    Cuando se itera sobre un objeto, no hay tal cosa como un «último» de la propiedad, porque el orden de las propiedades no está definido por el diseño.

    Cuando se itera sobre una matriz, usted puede comparar simplemente el primer parámetro de la llamada de retorno con la matriz.longitud-1) para la detección de la última iteración.

    En el código (para matrices):

    var arr = [ "a","b","c" ];
    
    $.each(arr, function(i,val) { if (i == arr.length-1) ... });
    • También quisiera saber por qué habría sido votada abajo… si hay algo mal, a continuación, háganoslo saber por qué (de lo contrario, ¿cómo aprendemos?)
    • Yo no downvote, pero realmente no responder a su pregunta. El uso de una variable adicional fuera del bucle puede detectar lo que la última clave iterado fue. Quiere una manera de hacerlo sin la variable adicional. No importa que la iteración orden no es siempre el mismo, a menudo usted sólo necesita saber el último decidir si desea agregar una coma o un punto, cuando la generación de texto o algo así.
    • Si usted lee la pregunta con cuidado, verás que el OP quiere saber cuál es la última propiedad se encuentra en el objeto: Cita: «quiero decir, LITERALMENTE, el último,que es el último par I tipo de ellos.»
  2. 4

    Philippe Leybaert la respuesta de los contornos de los problemas con tu pregunta muy bien, y probablemente hay una mejor manera de hacer lo que desea. Pero dicho esto, no veo una manera de hacer lo que le pides sin utilizar 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();
  3. 1

    Si usted necesita algo para que suceda, decir que se está iterando sobre una lista única, y que quería que otro objeto a ser insertado de forma condicional, pero si la condición no se cumple se necesita para ser insertado último, puedes 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 la misma cosa como Philippe solución, la verdad. Si hay alguna razón esto no debe trabajar, por favor deje un comentario y quiero saber, porque yo lo uso.

  4. 0

    Aquí propongo una nueva marca, mejora de la respuesta.

    Una forma elegante podría ser el uso de un after() función de contenedor. 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 ejecutar en el pasado, times es el número de la respuesta que usted está esperando.

    after() envuelve su función y crea una nueva función que se ejecuta su código sólo 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

    Comprobar este jsbin para un ejemplo en vivo: https://jsbin.com/sufaqowumo/edit?js de la consola,

  5. -2

    Ahora que he visto tu pregunta duplicada – donde has estado, «Para la siguiente,es una ‘c’:fn3 no» – parece que podría ser después de que el valor de la máximo 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];
  6. -2

    Ser jQuery.each función sincronizada, ¿usted realmente necesita para el seguimiento de la última iteración? Sólo hay que poner su código después de la $.each() llamada.

Dejar respuesta

Please enter your comment!
Please enter your name here