Her son yinelemeyi yakalamak


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

Döngü bittiğinde nasıl yakalanır? Yapabilirim if(i == 3)ama dizimin sayısının ne olduğunu bilmiyorum.

Yanıtlar:


173

ES6 + için güncellenmiş cevap burada .


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

çıktı:

Last callback call at index 2 with value 3

Bunun çalışma şekli arr.length, geri arama işlevine iletilen dizinin geçerli dizinine göre test etmektir .


Bunun arkasına geçebilirim, biraz daha net, ancak aslında başka bir şeyi garanti ettiğinden emin değilim, çünkü arrzaten her geri arama için bir kapanış kapsamındadır
jdphenix

ve gönderdikten hemen sonra, açık bir kullanım örneğini fark ettim - geri aramayı başka bir yerde tanımlamış olsaydınız. Utanmış bir yüz takın.
jdphenix

utanmış bir yüze gerek yok. Tam o soruyu sormuştum (arr varken neden diziye ihtiyacınız var), ama gözleminiz / sorunuz bunu açıklığa kavuşturdu, çok teşekkürler. Bu cevabı kendinizin yazmanız ve kendi cevabınızı sorgulamanız garip olsa da? Yanıtladığınız başka yorumlar silinmiş olabilir mi?
redfox05

@Russell Doğru, o zamandan beri kısmen kaldırılan bir tartışma var (oldu).
jdphenix

34

2018 ES6 + CEVAP :

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

Bunu bugün daha çok seviyorum - yine de 2015'te bile dolaylı olarak küresel ilan etmenin kötü bir fikir olduğunu hemen kabul edeceğim.
jdphenix

1
Unutmayın, bu const ve let'in global bildirimler olmadığını unutmayın, çünkü bunlar yöntemin tepesine yükselen var'ın aksine ... sadece anlık kapsamda geçerlidir.
Sterling Bourne

Huhh ... Önceki sürüm çok daha kısa ve okunabilir. Bu Nesne meselesi bir karmaşa.
giorgio79

2
Eğer anlamazsan bu sadece bir karışıklık Giorgio79. == veya === ile birincil karşılaştırma yönteminiz olarak Object.is () kullanmanın sayısız yararı vardır. Ancak yorumunuz için teşekkürler!
Sterling Bourne

2
@SterlingBourne bu faydaların ne olduğunu daha fazla açıklayabilir misiniz? (Bunu yanıta dahil etmek iyi olur)
ludovico

4
const arr= [1, 2, 3]
arr.forEach(function(element){
 if(arr[arr.length-1] === element){
  console.log("Last Element")
 }
})

2
Her zaman işe yaramayabilir. let o = { val:"ue" } ; let arr = [ o, 1, o ]; ...maalesef ilk yinelemedearr[arr.length-1] === element
e2-e4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.