如何使用单次forEach遍历先后执行两个函数,无需两次循环数组
实现方案
你可以在单次遍历Player.list的过程中先执行所有firstLayer方法,同时把secondLayer的调用存入临时任务队列,遍历完成后再批量执行队列里的任务即可,全程仅对Player.list遍历1次,执行效果和原有两次遍历完全一致。
示例代码如下:
const secondLayerTasks = [] // 仅遍历一次Player.list Player.list.forEach(player => { // 即时执行firstLayer player.firstLayer() // 收集secondLayer调用任务,用箭头函数绑定实例上下文避免this指向错误 secondLayerTasks.push(() => player.secondLayer()) }) // 所有firstLayer执行完成后,批量执行所有secondLayer secondLayerTasks.forEach(task => task())
补充说明
- 该方案和原有两次遍历的逻辑时间复杂度同为O(n),但减少了一次对
Player.list的迭代寻址开销,数组体量越大性能提升越明显 - 执行顺序完全符合要求:所有实例的
firstLayer全部执行完毕后,才会开始执行任意实例的secondLayer,和原有实现的效果没有差异 - 用箭头函数包裹调用可以省去手动
bind绑定实例的步骤,避免上下文丢失问题
内容的提问来源于stack exchange,提问作者DarePhoenix
相关产品推荐
相关产品推荐

