ловить для каждой последней итерации

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

Как поймать, когда цикл заканчивается? Я могу это сделать, if(i == 3)но могу не знать, каков номер моего массива.

Джейми Андерсон
источник

Ответы:

173

Обновленный ответ для ES6 + здесь .


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

выведет:

Last callback call at index 2 with value 3

Это работает по arr.lengthсравнению с текущим индексом массива, переданным в функцию обратного вызова .

jdphenix
источник
Я могу понять это, это немного яснее, хотя я не уверен, что это действительно гарантирует что-то еще, поскольку arrуже находится в области видимости как закрытие для каждого обратного вызова
jdphenix
и сразу после публикации я понял один очевидный вариант использования - если вы определили обратный вызов в другом месте. Вставьте смущенное лицо.
jdphenix
не нужно смущенное лицо. У меня был этот точный вопрос (зачем вам массив, когда у вас есть arr), но ваше наблюдение / вопрос прояснили это, так что спасибо. Хотя странно, что вы сами этот ответ написали, а собственный ответ сомневаетесь? Есть ли другие комментарии, на которые вы отвечали и которые, возможно, были удалены?
redfox05
@Russell: Это правильно, было (было) обсуждение, которое с тех пор было частично удалено.
jdphenix
34

ОТВЕТ 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}` ); 
      }
    });
Стерлинг Борн
источник
Сегодня этот вариант мне нравится больше - хотя я с готовностью признаю, что даже в 2015 году неявное объявление глобального было плохой идеей.
jdphenix
1
Не забывайте, что const и let не являются глобальными объявлениями, поскольку они действительны только в непосредственной области видимости ... в отличие от var, который поднимается на вершину метода.
Стерлинг Борн
Угу ... Предыдущая версия стала намного лаконичнее и читабельнее. Этот объект - беспорядок.
giorgio79 06
2
Это только беспорядок, если вы этого не понимаете Giorgio79. Использование Object.is () в качестве основного метода сравнения по сравнению с == или === дает множество преимуществ. Однако спасибо за ваш комментарий!
Стерлинг Борн,
2
@SterlingBourne, не могли бы вы объяснить, в чем заключаются эти преимущества? (Было бы хорошо включить это и в ответ)
Людовико
4
const arr= [1, 2, 3]
arr.forEach(function(element){
 if(arr[arr.length-1] === element){
  console.log("Last Element")
 }
})
Джастин Коулман
источник
2
Может не всегда работать. let o = { val:"ue" } ; let arr = [ o, 1, o ]; ...к сожалению, первая итерация будетarr[arr.length-1] === element
e2-e4