Подтвердить что ты не робот

Как поймать последнюю итерацию внутри $.each в jQuery?

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

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

Лучше всего, если не будут использоваться дополнительные переменные.

ИЗМЕНИТЬ: Я имею в виду LITERALLY последний, который является последней парой, которую я набираю.

4b9b3361

Ответ 1

Ваша переменная example называется "arr", но это не массив вообще (это объект). Это немного запутывает.

При итерации по объекту нет такой вещи, как "последнее" свойство, потому что порядок свойств undefined по дизайну.

При повторении массива вы можете просто сравнить первый параметр обратного вызова с (array.length-1) для обнаружения последней итерации.

В коде (для массивов):

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

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

Ответ 2

Ответ Филиппа Лейбарта очень хорошо описывает проблемы с вашим вопросом, и, вероятно, есть более четкий способ делать то, что вы хотите. Но это говорит о том, что я не вижу способ делать то, что вы просите, не используя дополнительную переменную.

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

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

obj[lastKey].doStuffForLastIteration();

Ответ 3

Если вам что-то нужно, скажите, что вы выполняете итерацию по одному списку, и вы хотите, чтобы другой объект был вставлен условно, но если условие не выполнено, вам нужно, чтобы оно было вставлено последним, вы можете сделать что-то вроде:

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

что на самом деле то же самое, что и решение Philippe. Если есть какая-то причина, это не должно работать, прокомментируйте и дайте мне знать, потому что я использую его.

Ответ 4

Здесь я предлагаю совершенно новый, улучшенный ответ.

Элегантным способом может быть использование оболочки after(). Здесь код:

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

fn - это функция, которую вы хотите выполнить, наконец, times - это количество различных ответов, которые вы ожидаете.

after() обертывает вашу функцию и создает новую функцию, которая запускает свой код только после вызовов times. Вот краткий пример:

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

var myCallback = after(onLastResponse, 3);

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

Проверьте этот jsbin для живого примера: https://jsbin.com/sufaqowumo/edit?js,console

Ответ 5

Теперь, когда я увидел ваш повторяющийся вопрос - где вы указываете: "Для следующего:" c ": fn3" - кажется, вы можете после значение максимального свойства объекта.

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

Функция jQuery.each syncronous, вам действительно нужно отслеживать последнюю итерацию? Просто введите код после вызова $.each().