株式会社antsのホームページへようこそ。

[AS3.0]Arrayクラスの便利メソッド

2
Posted in Lab. By tanaka

AS3で追加された機能と言えばByteArrayとかE4Xとか… その辺が真っ先に思いつきますよね。その陰で基本クラスなんかも地味に便利になっていたりします。
例えばDateクラス。今までは年月日の取得/設定にgetFullYear()やらsetMonth()やらのメソッドを使っていたわけですが、AS3では同じことをプロパティで出来るようになってます。
そんな感じで知っておくとちょっとだけ便利な機能がArrayクラスにもあるので紹介します。


■forEach() / map()
配列の要素を一個ずつ取り出して処理したいときにはループステートメントを使うのが一般的ですが、これらのメソッドを使えばループを書かかなくてもオッケーです。例えば、要素を一個ずつtrace()するのはこんな感じ。


var arr:Array = [123, "abc", "def", 456, "ghi"];
arr.forEach(myFunc);

function myFunc(item:*, index:int, array:Array):void {
  trace(item);
}

forEach()に渡した関数が要素の数だけ実行されるわけです。関数にはパラメータとして、要素の値/要素のインデックス/配列への参照が渡されます。
じゃあmap()の方は何かと言うと、各要素に対して関数を実行した結果を配列で受け取れるのです。関数からは結果を戻り値で返す必要があります。


var arr:Array = ["a", "b", "c"];
var pics:Array = arr.map(addSuffix);
trace(pics); //出力結果: a.jpg,b.jpg,c.jpg

function addSuffix(item:String, index:int, array:Array):String {
  return item + ".jpg";
}

■every() / some() / filter()
これらもforEach()やmap()と似たメソッドで使い方もほとんど同じです。が、用途としては配列の各要素が何らかの条件を満たしているかどうかを調べるのに使います。
every()は”すべての要素”が指定の条件を満たしているときにtrueを返します。some()は”一部の要素”が条件を満たしているときにtrueを返します。名前の通りですね。filter()はと言えば、条件を満たす要素だけをフィルタに通して配列で返してくれるのです。
で、肝心な条件判断はパラメータに渡す関数で行います。下の例では要素がStringかどうか調べています。


var arr:Array = [123, "abc", "def", 456, "ghi"];
trace(arr.every(isString)); //出力結果: false
trace(arr.some(isString)); //出力結果: true
trace(arr.filter(isString)); //出力結果: abc,def,ghi

function isString(item:*, index:int, array:Array):Boolean {
  return item is String;
}

■indexOf() / lastIndexOf()
おまけ的な紹介ですが、Stringクラスでお馴染みのメソッドがArrayでも使えます。これがあると結構便利ですよね。おしまい。

2 Responses to “[AS3.0]Arrayクラスの便利メソッド”
  1. いまい

    as3をやっと初めました。
    Arrayを検索したらここが引っかかりました。
    ちょうどツボでした。
    どうもです。

  2. タナカヤスヒロ

    あれ?ヨキにぃさんAS3スタートダッシュしてたじゃん…
    まあArrayとかあんま見直さないよね。