我有下面的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);
}
}
发布于 2012-03-27 09:50:52
当您执行.splice()
时,数组将被重新索引,这意味着当一个索引被删除时,您将跳过一个索引,并且缓存的.length
已过时。
要修复它,您需要在.splice()
之后递减i
,或者简单地反向迭代……
var i = Auction.auctions.length
while (i--) {
...
if (...) {
Auction.auctions.splice(i, 1);
}
}
这样,重新索引不会影响迭代中的下一项,因为索引只影响从当前点到数组末尾的项,并且迭代中的下一项低于当前点。
发布于 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);
}
}
如果你从最后弹出它们,这并不重要,因为当你向后返回时,索引将被保留。
发布于 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语句中添加了减量。
https://stackoverflow.com/questions/9882284
复制相似问题