为了账号安全,请及时绑定邮箱和手机立即绑定

循环遍历数组并删除项,而不中断for循环。

循环遍历数组并删除项,而不中断for循环。

梦里花落0921 2019-06-18 16:23:35
我有下面的for循环,当我使用splice()要删除一个项,我将得到“秒”是未定义的。我可以检查它是否是未定义的,但我觉得可能有更优雅的方法来做到这一点。我们的愿望是简单地删除一个项目并继续进行下去。for (i = 0, len = Auction.auctions.length; i < len; i++) {     auction = Auction.auctions[i];     Auction.auctions[i]['seconds'] --;     if (auction.seconds < 0) {          Auction.auctions.splice(i, 1);     }           }循环遍历数组并删除项,而不中断for循环。
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

执行以下操作时,将重新编制数组的索引。.splice(),这意味着当索引被删除时,您将跳过索引,并且缓存.length已经过时了。

要解决这个问题,你要么需要减少i在.之后.splice()或者简单地反向迭代.。

var i = Auction.auctions.lengthwhile (i--) {
    ...
    if (...) { 
        Auction.auctions.splice(i, 1);
    } }

这样,重新索引不会影响迭代中的下一个项,因为索引只影响从当前点到数组末尾的项,并且迭代中的下一个项低于当前点。


查看完整回答
反对 回复 2019-06-18
?
慕后森

TA贡献1802条经验 获得超5个赞

这是一个很常见的问题。解决方案是向后循环:

for (var i = Auction.auctions.length - 1; i >= 0; i--) {
    Auction.auctions[i].seconds--;
    if (Auction.auctions[i].seconds < 0) { 
        Auction.auctions.splice(i, 1);
    }}

如果你把它们从尾端弹出,这并不重要,因为当你倒退的时候,指数会被保存下来。


查看完整回答
反对 回复 2019-06-18
?
慕仙森

TA贡献1827条经验 获得超7个赞

每次在循环中重新计算长度,而不是仅仅在一开始就重新计算长度,例如:

for (i = 0; i < Auction.auctions.length; i++) {
      auction = Auction.auctions[i];
      Auction.auctions[i]['seconds'] --;
      if (auction.seconds < 0) { 
          Auction.auctions.splice(i, 1);
          i--; //decrement
      }}

这样你就不会越界了。

编辑:在if语句中添加了一个递减项。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 639 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信