catch forKażda ostatnia iteracja

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

Jak złapać koniec pętli? Mogę to zrobić, if(i == 3)ale mogę nie wiedzieć, jaki jest numer mojej tablicy.

Jamie Anderson
źródło

Odpowiedzi:

179

Zaktualizowana odpowiedź na ES6 + jest tutaj .


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

wyświetli:

Last callback call at index 2 with value 3

Sposób, w jaki to działa, polega na sprawdzaniu arr.lengthbieżącego indeksu tablicy przekazanego do funkcji zwrotnej .

jdphenix
źródło
Mogę się za tym zająć, jest to trochę bardziej jasne, chociaż nie jestem pewien, czy faktycznie gwarantuje cokolwiek innego, ponieważ arrjest już w zakresie jako zamknięcie dla każdego wywołania zwrotnego
jdphenix
i natychmiast po wysłaniu zdałem sobie sprawę z jednego oczywistego przypadku użycia - jeśli zdefiniowałeś wywołanie zwrotne w innym miejscu. Wstaw zakłopotaną minę.
jdphenix
nie potrzeba żadnej zawstydzonej twarzy. Miałem dokładnie to pytanie (dlaczego potrzebujesz tablicy, skoro masz arr), ale twoja obserwacja / pytanie wyjaśniło to, więc dzięki. Chociaż dziwne, że sam napisałeś tę odpowiedź i kwestionujesz własną odpowiedź? Czy są inne komentarze, na które odpowiadałeś, a które być może zostały teraz usunięte?
redfox05
@Russell Zgadza się, istnieje (była) dyskusja, która została częściowo usunięta.
jdphenix
33

ODPOWIEDŹ 2018 ES6 + JEST :

    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}` ); 
      }
    });
Sterling Bourne
źródło
1
Nie zapominaj, że deklaracje const i let nie są deklaracjami globalnymi, ponieważ są one ważne tylko w bezpośrednim zasięgu ... w przeciwieństwie do var, który jest podnoszony na początek metody.
Sterling Bourne
1
Huhh ... Poprzednia wersja jest dużo bardziej zwięzła i czytelna. Ten przedmiot to bałagan.
giorgio79
2
To tylko bałagan, jeśli go nie rozumiesz Giorgio79. Istnieje wiele zalet używania Object.is () jako podstawowej metody porównywania w porównaniu z == lub ===. Jednak dzięki za komentarz!
Sterling Bourne
3
@SterlingBourne Czy możesz dokładniej wyjaśnić, jakie to korzyści? (Dobrze by było to również zawrzeć w odpowiedzi)
ludovico
1
Używanie Object.isdo czegoś tak prostego, jak oddzielenie dwóch liczb całkowitych (które nie mogą być nawet -0 lub NaN) jest zdecydowanie nieuporządkowane. Powiedz mi, @SterlingBourne, jakie są korzyści?
Gust van de Wal
4
const arr= [1, 2, 3]
arr.forEach(function(element){
 if(arr[arr.length-1] === element){
  console.log("Last Element")
 }
})
Justin Coleman
źródło
4
Może nie zawsze działać. let o = { val:"ue" } ; let arr = [ o, 1, o ]; ...niestety pierwsza iteracja będzie miałaarr[arr.length-1] === element
e2-e4