catch forEach iteration terakhir

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

Bagaimana cara menangkap saat loop berakhir? Saya bisa melakukannya if(i == 3)tetapi saya mungkin tidak tahu berapa jumlah array saya.

Jamie Anderson
sumber

Jawaban:

174

Jawaban terbaru untuk ES6 + ada di sini .


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

akan menghasilkan:

Last callback call at index 2 with value 3

Cara kerjanya adalah menguji arr.lengthindeks array saat ini, yang diteruskan ke fungsi callback .

jdphenix.dll
sumber
Saya bisa mendapatkan di belakangnya, ini sedikit lebih jelas, meskipun saya tidak yakin itu benar-benar menjamin hal lain, karena arrsudah dalam cakupan sebagai penutupan untuk setiap panggilan balik
jdphenix
dan segera setelah memposting bahwa saya menyadari satu kasus penggunaan yang jelas - jika Anda telah menetapkan panggilan balik di tempat lain. Masukkan wajah malu.
jdphenix
tidak perlu wajah malu. Saya punya pertanyaan yang tepat (Mengapa Anda membutuhkan array ketika Anda memiliki arr), tetapi pengamatan / pertanyaan Anda menjernihkannya, jadi terima kasih. Meskipun aneh bahwa Anda sendiri yang menulis jawaban itu, dan Anda mempertanyakan jawaban Anda sendiri? Apakah ada komentar lain yang Anda tanggapi yang mungkin sekarang telah dihapus?
redfox05
@Russell Benar, ada (dulu) diskusi yang telah dihapus sebagian.
jdphenix
34

ES6 + ANSWER 2018 ADALAH :

    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
sumber
Saya lebih menyukai yang ini hari ini - meskipun saya akan segera mengakui bahkan di tahun 2015 secara implisit menyatakan bahwa global adalah ide yang buruk.
jdphenix
1
Jangan lupa, bahwa const dan let bukan deklarasi global, karena hanya valid dalam cakupan langsung ... tidak seperti var, yang diangkat ke bagian atas metode.
Sterling Bourne
Huhh ... Versi sebelumnya jauh lebih ringkas dan mudah dibaca. Benda Object ini berantakan.
giorgio79
2
Ini hanya berantakan jika Anda tidak memahaminya Giorgio79. Ada banyak manfaat menggunakan Object.is () sebagai metode perbandingan utama Anda versus == atau ===. Terima kasih atas komentar Anda!
Sterling Bourne
2
@SterlingBourne bisakah Anda menjelaskan lebih lanjut apa saja manfaat tersebut? (Akan lebih baik untuk memasukkannya dalam jawaban juga)
ludovico
5
const arr= [1, 2, 3]
arr.forEach(function(element){
 if(arr[arr.length-1] === element){
  console.log("Last Element")
 }
})
Justin Coleman
sumber
2
Mungkin tidak selalu berhasil. let o = { val:"ue" } ; let arr = [ o, 1, o ]; ...sayangnya iterasi pertama akan memilikiarr[arr.length-1] === element
e2-e4