循环遍历数组并删除项,而不中断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);
    }           }

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

梦里花落0921
浏览 640回答 3
3回答

青春有我

执行以下操作时,将重新编制数组的索引。.splice(),这意味着当索引被删除时,您将跳过索引,并且缓存.length已经过时了。要解决这个问题,你要么需要减少i在.之后.splice()或者简单地反向迭代.。var&nbsp;i&nbsp;=&nbsp;Auction.auctions.lengthwhile&nbsp;(i--)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(...)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Auction.auctions.splice(i,&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;}这样,重新索引不会影响迭代中的下一个项,因为索引只影响从当前点到数组末尾的项,并且迭代中的下一个项低于当前点。

慕后森

这是一个很常见的问题。解决方案是向后循环:for&nbsp;(var&nbsp;i&nbsp;=&nbsp;Auction.auctions.length&nbsp;-&nbsp;1;&nbsp;i&nbsp;>=&nbsp;0;&nbsp;i--)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Auction.auctions[i].seconds--; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Auction.auctions[i].seconds&nbsp;<&nbsp;0)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Auction.auctions.splice(i,&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;}}如果你把它们从尾端弹出,这并不重要,因为当你倒退的时候,指数会被保存下来。

慕仙森

每次在循环中重新计算长度,而不是仅仅在一开始就重新计算长度,例如:for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;Auction.auctions.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auction&nbsp;=&nbsp;Auction.auctions[i]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Auction.auctions[i]['seconds']&nbsp;--; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(auction.seconds&nbsp;<&nbsp;0)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Auction.auctions.splice(i,&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i--;&nbsp;//decrement &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}}这样你就不会越界了。编辑:在if语句中添加了一个递减项。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript