catch forEach останньої ітерації


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

Як зловити, коли петля закінчується? Я можу це зробити, if(i == 3)але, можливо, я не знаю, який номер мого масиву.

Відповіді:


174

Оновлена ​​відповідь для 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

2
Це лише безлад, якщо ти цього не розумієш Giorgio79. Використання Object.is () як основного методу порівняння має численні переваги порівняно з == або ===. Дякую за ваш коментар!
Стерлінг Борн,

2
@SterlingBourne, ти можеш пояснити далі, які це переваги? (Було б непогано включити це і у відповідь)
ludovico

5
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.