ループを中断せずに配列をループしてアイテムを削除する 質問する

ループを中断せずに配列をループしてアイテムを削除する 質問する

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

ベストアンサー1

を実行すると配列のインデックスが再作成されます.splice()。つまり、インデックスが削除されるとそのインデックスがスキップされ、キャッシュ.lengthは古くなります。

iこれを修正するには、の後に減分する.splice()か、単純に逆順に反復する必要があります...

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

この方法では、インデックス付けは現在のポイントから配列の最後までの項目にのみ影響し、反復内の次の項目は現在のポイントよりも低いため、再インデックス付けは反復内の次の項目に影響しません。

おすすめ記事