迭代数组并删除里面元素,而不打破循环

Review 的时候,发现了下面的问题,我就总结一下发上来了~

问题的代码简化版

for (let i = 0; i < locations.length; i++) {
  if (locations[i] === -1) {
    locations.remove(locations[i]); //删除数组里的第 i 个元素
    i = 0;//不得已的办法 有什么更好的解决方法吗 需求是直接更改到locations数组的数据
  }
}

问题: 实践后不得已重置了计数器i=0,不然会发生跳数的情况,有没有不重置计数器又能达成需求的方法

解决方法

发生跳数,是因为删除 item 的时候,导致后面的 item 位置向前移动 1 位了,且索引增加了 1 ,因此跳过了 1 个 item

解决思路: 直接从后向前进行迭代即可解决,因为删除数组中的 item ,即使后面的 item 前移,也不会导致跳过的问题

for (let i=locations.length-1; i>=0; i--) {
  if (locations[i] === -1) {
    locations.remove(locations[i]); //删除数组里的第 i 个元素
  }
}

更多其它的思路,参考这里:

  • Looping through array and removing items, without breaking for loop

你可能感兴趣的:(迭代数组并删除里面元素,而不打破循环)