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


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сравнению с текущим индексом массива, переданным в функцию обратного вызова .


Я могу понять это, это немного яснее, хотя я не уверен, что это действительно гарантирует что-то еще, поскольку 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.