1. ホーム
  2. javascript

[解決済み] forループを壊さずに配列をループして項目を削除する

2022-03-18 03:09:40

質問

以下のような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);
    }           
}

解決方法は?

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

これを修正するためには、以下のように i の後に .splice() あるいは、単純に逆順に繰り返すか...。

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

この方法では、再インデックス付けは、現在のポイントから配列の終わりまでのアイテムにのみ影響し、反復の次のアイテムは現在のポイントよりも低い位置にあるため、反復の次のアイテムに影響を与えません。