29.配列まとめ1

AS3の配列についてまとめておく

私の場合、AS3(というかFlex2SDKかな?)を使うようになって、きっちり変数の型を宣言するようになりました。

そうしないとコンパイルできない設定になっていますので必然的に宣言していますが、おかげでエラーを回避できたり、理解が深まったりとありがたく思っております。

ところが、配列の場合、その中身があやふやでもコンパイルは通るし、実行時にも動いてくれるわけです。

そのため、予期せぬエラーに苦しむことも、、、

ということで、ここでは配列について自分でも「あれー?どうだったかなー?」(ココおやじギャグね)と毎回引っかかるようなことをまとめておきます。

配列のコピー

arrという配列がすでにあったとして、hogeにまるごとコピーする時。

var hoge:Array=arr.slice();

配列を配列に追加する

arrという配列に配列hogeをまるごと追加する時。

arr=arr.concat(hoge);

中身がオブジェクトの場合の注意

配列の中身によくオブジェクトを入れます。

var arr:Array=[{price:100 , volume:10} , {price:200 , volume:15}];
trace(arr[0].price);//100が表示される

すごく便利ですが、よく起こすトラブルがこんなの。

添え字に対して配列が存在する時だけ処理したい、というよくある状況なんですが、下のようにすると実行時に止まります。最後のENDは表示してくれません。

//止まってしまう例
for (var ii:uint=0;ii<nn;ii++){
if (arr[ii].price){//存在しないと止まる
trace(arr[ii].price);
}
}
trace("END");

また、入力ミスなどで存在しないプロパティ名を指定した場合、コンパイルは通りますが実行時に止まります。

//これも止まってしまいます
for (var ii:uint=0;ii<nn;ii++){
if (arr[ii].puraisu){//存在しない
trace(arr[ii].price);
}
}
trace("END");

わざわざ注意して判定用のif文を入れてるのに、下手をするとそこで止まってしまう、というなんとも釈然としないものがありますが、そんなこと愚痴ってても仕方ないですね。

ここは、こんな感じで。

//これはOK
for (var ii:uint=0;ii<nn;ii++){
if (arr[ii]){
trace(arr[ii].price);
}
}
trace("END");//表示されます

止まるんだったら、なにか表示してくれてもいいのに、、、なんて思ったりもするんだけど、やっぱり黙ってる方がなにかと都合がいいんだろうなあ。

→29.配列まとめ2

28.連想配列←