循环通过数组并删除项目,而不中断循环

2022-08-29 22:41:46

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

答案 1

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

要修复它,您要么需要在 a 之后递减,要么只需反向迭代...i.splice()

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

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


答案 2

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

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

如果您从末尾弹出它们并不重要,因为当您倒退时,索引将被保留。