最後の反復ごとにキャッチ


94
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
後回し

投稿するとすぐに、1つの明らかなユースケースに気づきました。他の場所でコールバックを定義した場合です。恥ずかしい顔を挿入します。
jdphenix 2015

恥ずかしい顔は必要ありません。私はその正確な質問をしました(あなたが到着したときになぜあなたは配列が必要なのですか)、しかしあなたの観察/質問はそれをクリアしたので、ありがとう。あなた自身がその答えを書いたのは奇妙ですが、あなたはあなた自身の答えに疑問を持っていますか?おそらく削除された、あなたが返信していた他のコメントはありますか?
redfox05 2015年

@Russell正解です。その後、部分的に削除されたディスカッションがあります。
jdphenix 2015年

34

2018 ES6 +の回答は次のとおりです:

    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 2018

1
constとletは、直接のスコープでのみ有効であるため、グローバル宣言ではないことを忘れないでください...メソッドの先頭に引き上げられるvarとは異なります。
スターリングボーン

うーん...以前のバージョンははるかに簡潔で読みやすいです。このオブジェクトのものはめちゃくちゃです。
giorgio 7919年

2
Giorgio79を理解していないと、混乱するだけです。==または===と比較する主な方法としてObject.is()を使用することには、多くの利点があります。コメントありがとうございます!
スターリングボーン

2
@SterlingBourneこれらのメリットについてさらに説明していただけますか?(それも答えに含めるのが良いでしょう)
ludovico

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.