마지막 반복마다


95
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이미 각 콜백에 대한 클로저로 범위에 있기 때문에
jdphenix

게시 즉시 다른 곳에서 콜백을 정의한 경우 명백한 사용 사례가 하나 있음을 깨달았습니다. 당황한 얼굴을 삽입합니다.
jdphenix

당황한 얼굴이 필요하지 않습니다. 나는 그 정확한 질문을 가지고 있었지만 (왜 당신이 arr을 가지고있을 때 배열이 필요합니까) 당신의 관찰 / 질문이 그것을 해결 했으므로 감사합니다. 자신이 그 답을 쓴 것이 이상하지만 자신의 대답에 의문을 제기합니까? 답장 중이었던 다른 댓글이 삭제 되었습니까?
redfox05 2015

@Russell 맞습니다. 이후 부분적으로 삭제 된 토론이 있습니다.
jdphenix

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

1
잊지 마세요. const와 let은 전역 선언이 아닙니다. 메소드의 맨 위에 올라가는 var와 달리 즉각적인 범위에서만 유효하기 때문입니다.
Sterling Bourne

Huhh ... 이전 버전은 훨씬 더 간결하고 읽기 쉽습니다. 이 Object 물건은 엉망입니다.
giorgio79

2
Giorgio79를 이해하지 못하면 엉망입니다. Object.is ()를 == 또는 ===와 비교하는 기본 방법으로 사용하면 많은 이점이 있습니다. 그러나 귀하의 의견에 감사드립니다!
Sterling Bourne

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.