配列操作で消去時に気をつけること

はまった、というか割とはまってる人がいると思ったのでメモ。
プログラミングを始めた頃にこういうことがあったと思った懐かしさから書きました。

例えば以下の配列があったとします。

var array = [0,1,2,3,4,5];

さてarray全要素を削除したいというとき、例えば以下のように書いたとします。

//配列の要素を全て削除する
for(element in array) array.remove();

remove()は配列の先頭要素を削除する処理です。

このfor文の結果を表示するとこうなります。

[1,3,5]

...あれ?なんで全部削除できてないの? ちょっと考えてみてください。

理由はこうです。

このfor文は頭の良いループ君で、一回処理が終わると配列の見る位置をずらしてくれます。

[0,1,2,3,4,5]
 ↑    //0をみている

何らかの処理が終わると
[0,1,2,3,4,5]
   ↑   //1をみている

といったような感じです。 ここでループ中に配列要素の削除処理をするとこうなります。

[0,1,2,3,4,5]
 ↑    //0をみている

削除処理をする

[1,2,3,4,5]
 ↑    //0と同じ位置にきた1をみている

処理が一回終わったので戻る
戻った時、見る位置をずらす

[1,2,3,4,5]
   ↑    //2をみている

わかりましたでしょうか。
ずれてしまった!!
ループ中で要素の位置が変わったことで、すべて見ることができなくなってしまいました!

ここで活躍するのは、処理をし続けてくれるwhileマシーンくんです
正しい終了条件さえ設定すれば良いだけの話です。while文で解決します。

while(array.length != 0) array.remove();

配列の長さが0になるまでと設定することで、すべての要素を削除できます。

おわかりいただけたでしょうか
配列の操作には気を付けましょう。