ActionScript 3.0入門ノート CS4でタグ「Array」が付けられているもの

(section03-02 配列の値を並べ替えるから抜粋)

 配列の値を逆順に並べ替えたいときは、reverse()を使います。

[:script:]配列の値を逆順にする
var vlist:Array=["青森","千葉","京都","宮崎"];
vlist.reverse();
trace(vlist);//出力:宮崎,京都,千葉,青森
(section03-01 Arrayクラスの配列から抜粋)

 配列の値の並びをストリング値にするには、toString()、join()のメソッドが利用できます。たとえば、["black","white","yellow"]というcolors配列があったときcolors.toString()は"black,white,yellow"という1つのストリングを作ります。toString()を実行しても元のcolors配列は変更されません。
 配列をストリングにする必要があるのは、配列の並びをテキストフィールドに表示するといった場合です。

[:script:]フィールドに配列の値を入れる
var colors:Array=["black","white","yellow"];
colors_fld.text=colors.toString();
fig03-01-01.jpg
 配列とストリングを連結するだけで、配列の値の並びは強制的にストリングに変換されます。元のcolors配列は変更されません。

[:script:]フィールドに配列の値を入れる
var colors:Array=["black","white","yellow"];
colors_fld.text="色は「"+colors+"」です。";
fig03-01-02.jpg
ストリングに変換する際に区切り文字を置換する
 join()は配列をストリングに変換する際に区切り文字を「,」ではなく指定の文字に置換します。次の例は区切りを「または」に置換しています。

[:script:]区切り文字を「または」に置換してストリングに変換する
var colors:Array=["黒","白","赤"];
var msg:String=colors.join("または");
trace(msg);//出力:黒または白または赤
 区切りを""にすれば、配列の値を1つのストリングに連結できます。

[:script:]区切り文字を取り除いたストリングに変換する
var colors:Array=["黒","白","赤"];
var msg:String=colors.join("");
trace(msg);//出力:黒白赤
(section03-01 Arrayクラスの配列から抜粋)

 配列の値を検索したい場合には、すべての値を総当たりでチェックしなければならない場合もありますが、単純に値が含まれているかどうかがわかればよい場合があります。そのような場合にはindexOf()、lastIndexOf()のメソッドが便利です。
 indexOf()は指定した検索開始位置から後ろへ検索して最初に見つかった位置を返します。検索開始位置を省略すると最初から探しします。開始位置をマイナスで指定すると後ろから位置を数えます。検索の結果見つからなかった場合には-1が返ってきます。

[:script:]配列を前から後ろへ検索する
var vlist:Array = new Array("a","x","b","a","x","c");
trace(vlist.indexOf("a",2));//出力:3
trace(vlist.indexOf("a",4));//出力:-1
//開始位置を省略
trace(vlist.indexOf("a"));//出力:0
//開始位置を後ろから数える
trace(vlist.indexOf("x",-3));//出力:4
補足:
2行目:"a"をインデックス番号2、つまり"b"の位置から後ろへ検索します。すると"b"の次の"a"が見つかります。この"a"はインデックス番号3なので3が返ります。
3行目:インデックス番号4の"x"の位置から"a"の検索を開始します。"x"より後ろに"a"はないので-1が返ります。
5行目:配列の先頭から"a"を検索します。先頭の"a"が見つかるので、インデックス番号0が返ります。
7行目:検索開始位置が-3なので、後ろから3個目の"a"から検索を開始します。検索方向は"a"から後ろ方向です。"a"の次の"x"が見つかります。この"x"のインデックス番号は4番です。

 lastIndexOf()は指定した検索開始位置から手前に検索して最初に見つかった位置を返します。検索開始位置を省略すると最後から探します。開始位置をマイナスで指定すると後ろから位置を数えます。検索の結果見つからなかった場合には-1が返ってきます。

[:script:]配列を後ろから前へ検索する
var vlist:Array=new Array("a","x","b","a","x","c");
trace(vlist.lastIndexOf("a",2));//出力:0
trace(vlist.lastIndexOf("a",4));//出力:3
//開始位置を省略
trace(vlist.lastIndexOf("a"));//出力:3
//開始位置を後ろから数える
trace(vlist.lastIndexOf("x",-3));//出力:1
補足:
後ろから検索しても、返ってくる値は前から数えるインデックス番号です。勘違いしやすいので注意してください。
2行目:インデックス番号2、つまり"b"の位置から前方向に"a"を検索します。先頭の"a"が見つかるので、インデックス番号0が返ります。
3行目:インデックス番号4、つまり後ろの"x"の位置から前方向へ"a"を検索します。すぐ左の"a"が見つかるので、インデックス番号3が返ります。
5行目:開始位置を省略すると最後から手前へ検索します。後ろの"a"が見つかるので、インデックス番号3が返ります。後ろから3個目ではなく、"a"のインデックス番号です。
7行目:後ろから3個目の"a"から前方向へ"x"を検索します。前から2個目の"x"が見つかるので、インデックス番号1が返ります。

 次のuniquePush()はnoListに同じ値が入っていなければ値を追加する関数です。引数で渡された値が配列に含まれていないかどうかをindexOf()で検索して確かめ、検索結果が-1のときに値をpush()しています。

[:script:]ユニークな値だけ配列に追加する
function uniquePush(tmplist:Array, v:int):void {
	//値が配列に含まれていないか検索する
	var index:int=tmplist.indexOf(v);
	if (index==-1) {
		//値を追加する
		tmplist.push(v);
	}
}
//配列に値を追加していく
var noList:Array=new Array(1,2,3);
uniquePush(noList,2);
uniquePush(noList,50);
uniquePush(noList,60);
uniquePush(noList,50);
trace(noList);//出力:1,2,3,50,60
(section03-01 Arrayクラスの配列から抜粋)

 concat()は複数の配列を連結して新しい配列を作るメソッドです。次の例は配列alist、blist、clistを連結して配列newlistを作っています。式を見た感じでは配列alistにblist、clistの値を追加する印象がありますが、この演算で配列alistの値は変化しません。concat()の引数は何個でもかまいません。

[:script:]配列を連結して新しい配列を作る
var alist:Array=new Array("a","b","c");
var blist:Array=new Array("m","n");
var clist:Array=new Array("x","y","z");
var newlist:Array=alist.concat(blist,clist);
trace(newlist);//出力:a,b,c,m,n,x,y,z
(section03-01 Arrayクラスの配列から抜粋)

 配列は数値やストリングなどと違ってオブジェクトなので、配列を変数に代入するとリファレンス型の変数になります。たとえば、配列の入った変数alistを変数blistに代入したとき、どちらも同じ配列を参照しています。配列alist、blistに対して値の追加などの操作を行ったとき、片方の配列に操作した内容が両方に影響してしまいます。

[:script:]配列を複製したつもりでも同じ配列を参照している
var alist:Array=[1,2,3];
//blistにalistを代入する
var blist:Array=alist;
alist.push("x");//alistに"x"を追加
blist.push("y");//blistに"y"を追加
//どちらも同じ値になっている
trace(alist);//出力:1,2,3,x,y
trace(blist);//出力:1,2,3,x,y
 配列を複製したい場合にはslice()が利用できます。slice()の引数を省略するとslice(0)を実行した場合と同じになり、配列のすべての値を複製した新しい配列を作ることができます。

[:script:]配列を複製する
var alist:Array=[1,2,3];
//blistにalistを複製して代入する
var blist:Array=alist.slice();
alist.push("x");//alistに"x"を追加
blist.push("y");//blistに"y"を追加
//alistとblistは個別の配列になっている
trace(alist);//出力:1,2,3,x
trace(blist);//出力:1,2,3,y
(section03-01 Arrayクラスの配列から抜粋)

 配列の一部を取り出すメソッドにはslice()とsplice()があります。どちらも取り出した値の配列を作ります。slice()では元の配列は変化しないのに対し、splice()の場合は抜き取った値が元の配列から取り除かれるという違いがあります。
 次の例はslice()を使って新しい配列を作り出しています。取り出す位置はslice(startIndex,endIndex)のように指定します。このとき、slice(1,4)ならば1〜3番目を取り出し、4番目を含まないので注意が必要です。
 次の例では配列allListから1〜3番目の値を複製して新しい配列selectListを作成します。配列のインデックスは0からカウントするので、1〜3番目は"b"、"c"、"d"になります。slice()で値を取り出しても元の配列allListの中身はそのままで変化していません。

[:script:]配列の1〜3番目の値を取り出す
var allList:Array=["a","b","c","d","e","f"];
var selectList:Array=allList.slice(1,4);
//取り出した配列
trace(selectList);//出力:b,c,d
//元の配列は変化しない
trace(allList);//出力:a,b,c,d,e,f
 slice()は2番目の引数を省略できます。slice(3)のように引数を1つだけ指定した場合は3番目(並びでは4個目)から最後までの値を指定したことになります。

[:script:]配列の3番目から最後までの値を取り出す
var allList:Array=["a","b","c","d","e","f"];
var selectList:Array=allList.slice(3);
trace(selectList);//出力:d,e,f
trace(allList);//出力:a,b,c,d,e,f
 引数をマイナスにすると末尾から個数を数えて取り出します。次の例は末尾から4個の値を取り出した配列を作ります。インデックス番号と違って1から数えるので注意してください。

[:script:]配列の後ろから4個の値を取り出す
var allList:Array=["a","b","c","d","e","f"];
var selectList:Array=allList.slice(-4);
trace(selectList);//出力:c,d,e,f
trace(allList);//出力:a,b,c,d,e,f

*初版ではsplice()の項に間違いがあります。訂正原稿を参照してください。
(section03-01 Arrayクラスの配列から抜粋)

 push()が配列の最後に値を追加するメソッドなのに対し、unshift()は配列の先頭に値を挿入し、挿入後の配列の長さを返すメソッドです。同時に複数の値を挿入することもできます。
 次の例は最初に["red","yellow"]のcolors配列を作り、色を先頭に挿入しています。挿入結果の値の並び順に注目してください。

[:script:]配列の先頭に値を挿入する
var colors:Array=new Array("red","yellow");
//値を先頭に挿入する
colors.unshift("black");
var cnt:uint=colors.unshift("white","gray");
trace(cnt);//出力:5
trace(colors);//出力:white,gray,black,red,yellow
 逆にshift()は配列の先頭の値を抜き取るメソッドです。shift()で値を抜き取ると先頭の値が配列から削除されます。
 次の例はcolorsから先頭の色を抜き取っています。firstColorには先頭の値の"red"が入り、元のcolorsからは先頭の値が削除されて["yellow","black"]の2色になります。

[:script:]配列の先頭の値を抜き取る
var colors:Array = new Array("red", "yellow", "black");
var firstColor:String = colors.shift();
//取り出した値
trace(firstColor);//出力:red
//元の配列からは先頭の値が取り除かれている
trace(colors);//出力:yellow,black
(section03-01 Arrayクラスの配列から抜粋)

 Arrayクラスには、配列に値を追加挿入したり、値を抜き取るといったメソッドがあります。push()は配列の最後に値を追加し、追加後の配列の長さを返すメソッドです。同時に複数の値を追加することもできます。
 次の例は最初に空のcolors配列を作り、色を末尾に追加しています。結果として["red","yellow","green","black"]の配列になります。

[:script:]配列に値を追加する
//空の配列を作る
var colors:Array = new Array();
//値を追加する
colors.push("red");
colors.push("yellow","green");
//pushした順に値が追加されている
trace(colors);//出力:red,yellow,green

var cnt:uint=colors.push("black");
//pushすると配列の長さが返ってくる
trace(cnt);//出力:4
trace(colors);//出力:red,yellow,green,black
 逆にpop()は配列の最後の値を抜き取るメソッドです。演算子[]で最後の値を取り出しても元の配列に入っている値はそのままですが、pop()で値を抜き取ると最後の値が配列から削除されます。
 次の例はcolorsから最後の色を抜き取っています。lastColorには最後の値の"black"が入り、元のcolorsからは最後の値が削除されて["red","yellow"]の2色になります。

[:script:]配列の最後の値を抜き取る
var colors:Array=["red","yellow","black"];
var lastColor:String=colors.pop();
//取り出した値
trace(lastColor);//出力:black
//元の配列からは最後の値が取り除かれている
trace(colors);//出力:red,yellow
(section03-01 Arrayクラスの配列から抜粋)

 配列の長さ、すなわちエレメント(値)の個数はlengthプロパティで調べます。配列のインデックス番号は0からカウントしますが、lengthは1から数えます。

[:script:]配列の値の個数を調べる
var colors:Array=["red","green","yellow"];
var weekj:Array=new Array("日","月","火","水","木","金","土");
trace(colors.length);//出力:3
trace(weekj.length);//出力:7
 lengthは読み出しだけでなく値の設定も可能です。lengthを設定すると配列がその長さに変更されます。配列の長さよりも大きな値を設定するとundefinedが追加され、小さな値を設定すると長さに合わせてエレメントが後ろから削除されます。

[:script:]配列の長さを指定する
var colors:Array=["red","green","yellow","black"];
//配列より長いlengthを指定する
colors.length=8;
trace(colors);//出力:red,green,yellow,black,,,,
//配列より短いlengthを指定する
colors.length=3;
trace(colors);//出力:red,green,yellow
note 配列の長さを固定したい場合はVectorクラスを利用します。→ベクターのエレメントの個数を制限する

 次の例は配列からランダムに値を選ぶスクリプトです。randomValue()の2行目で配列の値の個数を元にランダムなインデックス番号を作り、3行目でリストから値を取り出します。

[:script:]配列からランダムに値を選ぶ
function randomValue(list:Array):String {
	var index:uint = Math.floor(Math.random() * list.length);
	var v:String = list[index];
	return v;
}

var colors:Array = ["red","green","blue","pink","black"];
//配列colorsから1色選ぶ
var color:String = randomValue(colors);
trace(color);
(section03-01 Arrayクラスの配列から抜粋)

 これまでの例では配列を演算子[]で作りましたが、配列のデータ型はArrayクラスであり、new演算子を使ってArrayクラスのインスタンスとして作ることができます。

[:script:]Arrayクラスのインスタンスとして配列を作る
var colors:Array=new Array("red","green","yellow");
var weekj:Array=new Array("日","月","火","水","木","金","土");
var vlist:Array=new Array(2900,"XA","white");
 new Array()で配列を作る場合、通常は引数で指定した値がそのまま配列のエレメント(要素)の値になりますが、引数が整数1個の場合は引数で指定した個数の配列が作られます。配列のエレメントの値は空(undefined)です。たとえば、次のスクリプトの4行目ではnew Array(5)で[5]ではなく[,,,,]が作られます。

[:script:]Array()の引数が整数1個のときに結果が違う
var vlist1:Array=new Array();//空の配列[]
var vlist2:Array=new Array("red");//配列["red"]
var vlist3:Array=new Array(5,3);//配列[5,3]
var vlist4:Array=new Array(5);//配列[,,,,]
(section03-01 Arrayクラスの配列から抜粋)

 配列の中に配列を入れた多次元配列を作ることができます。多次元配列は複雑なデータを操作する上で有効な手段となります。次のスクリプトは多次元配列から値を取り出す例です。

[:script:]多次元配列から値を取り出す
var colors:Array=[["red","pink"],["wihte","blue"],["green","black"]];
var myColor:String=colors[2][1];
trace(myColor);//出力:black
 2行目のcolors[2][1]では、まずcolors[2]の値を取り出します。位置を0から数えるので[2]は左から3番目の ["green", "black"]です。したがって、続いて ["green", "black"][1]を実行することになります。その結果、myColorには"black"が入ります。
(section03-01 Arrayクラスの配列から抜粋)

 配列とは仕切りで区切られた容器に複数の物を納めていくように、複数のデータを1個のグループのように扱える機能です。配列は配列演算子[]を使って作ることができます。値をカンマ(,)で区切り、[]で囲みます。データ型はArrayを指定します。

[:script:]配列演算子[]で配列を作る
var colors:Array=["red","green","yellow"];
var weekj:Array=["日","月","火","水","木","金","土"];
var vlist:Array=[2900,"XA","white"];

配列から値を取り出す
 配列から値を取り出すには、配列[インデックス番号]の式で配列の並びの位置を指して参照します。このとき、インデックス番号を左から0、1、2のように0から数えるので注意してください。値を取り出しても元の配列は変化しません。

[:script:]配列から値を取り出す
var colors:Array=["red","green","yellow"];
var colorA:String=colors[0];
var colorB:String=colors[1];
trace(colorA);//出力:red
trace(colorB);//出力:green
trace(colors);//出力:red,green,yellow

配列の値を入れ替える
 配列の値の位置を指して値を代入すれば、その位置の値が入れ替わります。

[:script:]配列の値を入れ替える
var colors:Array=["red","green","yellow"];
colors[1]="black";
trace(colors);//出力:red,black,yellow
 配列に入っている値の個数よりも大きなインデックス番号を指定して値を代入すると、途中の値は空のままで指定の位置に値が入ります。

[:script:]位置を指定して値を入れる
//空の配列を作る
var myArray:Array=[];
//値を入れる
myArray[0]="a";
myArray[1]="b";
myArray[4]="e";
trace(myArray);//出力:a,b,,,e
 配列の空の位置の値を取り出すとundefiendになります。なお、undefiendは取り出した値を入れる変数のデータ型に応じて値が変換されます。たとえば、String型ならばnull、int型ならば0に変換されます。

[:script:]値がない位置の値を取り出した結果
var myArray:Array=["a","b",,,"e"];
//値がない位置
trace(myArray[3]);//出力:undefined
//値の個数より大きなインデックス番号
trace(myArray[9]);//出力:undefined

//String型の変数に代入した場合
var v3:String=myArray[3];
trace(v3);//出力:null
//int型の変数に代入した場合
var v9:int=myArray[9];
trace(v9);//出力:0
(section01-05 データ型から抜粋)

 関数の引数に渡す値がプリミティブ型なのかリファレンス型なのかにも注意が必要です。プリミティブ型の変数を引数として渡したときは、関数の中でその引数に対して操作しても元の変数には影響がでません。一方、リファレンス型の変数を関数の引数として渡した場合には、関数の中で引数の値を変更すると元の変数の値が変化してしまいます。

値渡し(プリミティブ型)
 次の例では価格と個数から金額を計算するkeisan()を使っています。keisan()では変数tankaの値を引数kakakuで受け、それに個数を掛けた値をそのままkakakuの値として上書きしてます。結果を見るとわかるように演算後の変数tankaの値は2400のまま変化していません。

[:script:]引数で渡した変数は変化しない
var tanka:int = 2400;
var kingaku:int = keisan(tanka, 2);
//結果を調べる
trace(tanka); //出力:2400
trace(kingaku); //出力:4800

//引数で渡された変数を使って計算する
function keisan(kakaku:int, kosu:int):int {
	kakaku = kakaku * kosu;
	return kakaku;
}

参照渡し(リファレンス型)
 次の例は最小値を調べるためにArray型の変数を引数で渡した結果、元の配列の並びが変化してしまう例です。Arrya型の変数pricesを作り、数字の並びを配列として代入します。8行目以降で定義してあるgetMin()は引数で受けとった配列の中の最小値を調べて返す関数です。このとき、getMin()は引数vlistで受けた配列の値をvlist.sort()を実行して直接並べ替えています。この結果、2行目が実行されると最小値が変数lowPriceに代入されるだけではなく、引数として与えたpricesの値の並びも変えてしまうことになります。

[:script:]引数で渡した変数に入っていた配列の並びが変化してしまう
var prices:Array = [20, 56, 12, 40];
var lowPrice:int= getMin(prices);
//結果を調べる
trace(prices); //12,20,40,56
trace(lowPrice); //12

//引数で渡された変数を使って計算する
function getMin(vlist:Array):int {
	//vlistをソートする
	vlist.sort();
	//1番目の値を返す
	return vlist[0];
}

■この訂正は初版のものです。

p.110 のsplice()の説明が間違っていました。内容を訂正しお詫びします。間違っていたのは、第2引数で指定する値がendIndexではなく、deleteCountである点です。さらに第3引数以降で値を挿入できます。
splice()は次のようなメソッドです。p.108のslice()とスペルが似ているので注意です。また、インデックス番号は0から数えるので、「1番目」とは2個目の値を指しています。番目を「インデックス番号」と読み替えてください。

訂正文:
 抜き取る際に値を複製せずに元の配列から値を削除します。また、値を抜き取った位置に新しい値を代わりに挿入することもできます。これにより、splice()は値を抜き出すだけでなく、配列の値の削除や置換の目的でも利用できます。
 splice()の書式は次のとおりです。第1引数startIndexは抜き取り開始位置のインデックス番号、第2引数のdeleteCountでは抜き取る値の個数を指定します。入れ替える値は第3引数以降にカンマで区切って指定します。

書式:
splice(startIndex:int, deleteCount:uint, ... values):Array

 次の例では配列stockListのインデックス番号1から4個の値を抜き取って新しい配列pickUpListを作成します。元の配列stockListからは抜き取られた値が削除されています。

[:script:]配列のインデックス番号1から4個の値を抜き取る
var stockList:Array = ["a","b","c","d","e","f"];
var pickUpList:Array = stockList.splice(1,4);
//取り出した配列
trace(pickUpList);//出力:b,c,d,e
//元の配列からは値が抜き取られて削除されている
trace(stockList);//出力:a,f
 splice()は第2引数以降を省略できます。splice(3)のように引数を省略するとインデックス番号3から最後までの値を抜き出します。

[:script:]配列のインデックス番号3から最後までの値を抜き出す
var stockList:Array=["a","b","c","d","e","f"];
var pickUpList:Array=stockList.splice(3);
trace(pickUpList);//出力:d,e,f
trace(stockList);//出力:a,b,c
 引数をマイナスにすると末尾から個数を数えて取り出します。次の例は末尾から4個の値を取り出した配列を作ります。元の配列のstockListからは末尾の4個が削除されています。

[:script:]配列の末尾から4個を抜き出す
var stockList:Array=["a","b","c","d","e","f"];
var pickUpList:Array=stockList.splice(-4);
trace(pickUpList);//出力:c,d,e,f
trace(stockList);//出力:a,b

追加サンプル:
値を入れ替えるサンプルがないので、ここに新しいサンプルを追加しましょう!

[:script:]配列のインデックス番号2から3個の値を抜きとり、代わりに"X"、"Y"を挿入する。
var stockList:Array=["a","b","c","d","e","f"];
var pickUpList:Array=stockList.splice(2,3,"X","Y");
trace(pickUpList);//出力:c,d,e
trace(stockList);//出力:a,b,X,Y,f
まったく新しいAS3の世界!
694a.jpg
Adobe Flash CS4
詳細!ActionScript3.0入門ノート[完全改訂版](CD-ROM付)

楽しいActionScript。
新たなる1歩へと踏み出しましょう。
■内容は?→ 目次を見る
■評判は?→ 書評を読む
この本を書いたわけ

タグ

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

あわせて読みたいブログパーツ