赶上最后一次迭代


Answers:


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

嗯...以前的版本更加简洁易读。这个对象的东西是一团糟。
giorgio79

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.