bắt cho mỗi lần lặp cuối cùng


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

Làm thế nào để bắt khi vòng lặp kết thúc? Tôi có thể làm if(i == 3)nhưng tôi có thể không biết số mảng của tôi là gì.

Câu trả lời:


173

Câu trả lời cập nhật cho ES6 + là ở đây .


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

sẽ xuất:

Last callback call at index 2 with value 3

Cách thức hoạt động của điều này là kiểm tra arr.lengthchỉ số hiện tại của mảng, được chuyển cho hàm gọi lại .


Tôi có thể lấy đằng sau đó, thì rõ ràng hơn một chút, mặc dù tôi không chắc chắn rằng nó thực sự đảm bảo bất cứ điều gì khác, vì arrđã nằm trong phạm vi như một đóng cho mỗi callback
jdphenix

và ngay sau khi đăng, tôi đã nhận ra một trường hợp sử dụng rõ ràng - nếu bạn đã xác định lệnh gọi lại ở nơi khác. Chèn mặt xấu hổ.
jdphenix

không cần mặt xấu hổ. Tôi đã có câu hỏi chính xác đó (Tại sao bạn cần mảng khi bạn có arr), nhưng quan sát / câu hỏi của bạn đã giải đáp thắc mắc đó, vì vậy cảm ơn. Mặc dù kỳ lạ là chính bạn đã viết câu trả lời đó, và bạn tự hỏi câu trả lời của chính mình? Có những nhận xét khác mà bạn đã trả lời có lẽ đã bị xóa?
redfox05

@Russell Đúng vậy, có (đã) một cuộc thảo luận đã bị xóa một phần.
jdphenix

34

CÂU TRẢ LỜI ES6 + 2018 LÀ :

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

Tôi thích cái này hơn hôm nay - mặc dù tôi sẽ sẵn sàng thừa nhận rằng vào năm 2015 đã ngầm tuyên bố toàn cầu là một ý tưởng tồi.
jdphenix

1
Đừng quên rằng const và let không phải là khai báo toàn cục, vì chúng chỉ hợp lệ trong phạm vi tức thời ... không giống như var, được đưa lên đầu phương thức.
Sterling Bourne

Huhh ... Phiên bản trước ngắn gọn và dễ đọc hơn nhiều. Đối tượng này là một mớ hỗn độn.
giorgio79

2
Nó chỉ là một mớ hỗn độn nếu bạn không hiểu nó Giorgio79. Có rất nhiều lợi ích khi sử dụng Object.is () làm phương pháp so sánh chính của bạn so với == hoặc ===. Tuy nhiên, cảm ơn bình luận của bạn!
Sterling Bourne

2
@SterlingBourne bạn có thể giải thích thêm những lợi ích đó là gì không? (Sẽ rất tốt nếu bao gồm cả điều đó trong câu trả lời)
ludovico

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

2
Có thể không phải lúc nào cũng hoạt động. let o = { val:"ue" } ; let arr = [ o, 1, o ]; ...tiếc là lần lặp đầu tiên sẽ cóarr[arr.length-1] === element
e2-e4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.