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

新手上路,请多包涵

我有以下 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);
    }
}

原文由 dzm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 880
2 个回答

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

要修复它,您需要在 .splice() 之后减少 i ,或者只是反向迭代……

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

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

原文由 user1106925 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

如果您将它们从末尾弹出并不重要,因为索引将在您向后移动时保留。

原文由 frattaro 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题