首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >循环遍历数组并删除项,而不中断for循环

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

Stack Overflow用户
提问于 2012-03-27 09:44:08
回答 16查看 322.4K关注 0票数 560

我有下面的for循环,当我使用splice()删除一个项目时,我得到的是'seconds‘是未定义的。我可以检查它是否是未定义的,但我觉得可能有一种更优雅的方法来做到这一点。我们的愿望是简单地删除一项并继续进行。

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

回答 16

Stack Overflow用户

回答已采纳

发布于 2012-03-27 09:50:52

当您执行.splice()时,数组将被重新索引,这意味着当一个索引被删除时,您将跳过一个索引,并且缓存的.length已过时。

要修复它,您需要在.splice()之后递减i,或者简单地反向迭代……

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

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

票数 982
EN

Stack Overflow用户

发布于 2015-01-24 11:49:18

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

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

如果你从最后弹出它们,这并不重要,因为当你向后返回时,索引将被保留。

票数 210
EN

Stack Overflow用户

发布于 2012-03-27 09:50:20

每次循环时都要重新计算长度,而不是一开始就重新计算,例如:

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语句中添加了减量。

票数 55
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9882284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档