配列から論理積を求めるActionScript

AかつBかつCかつDかつ…

そんな感じで全ての条件がtrueになったかどうかを調べる事ってよくありますよね?例えばSWFの読み込みが完了しつつ外部からの画像を10枚ほど読み込みつつサウンドのローディングも完了しつつ…みたいに全ての条件が整わないと次に進めない、なんて時です。

そういうときはフラグを全部配列に入れてやって、その配列の論理積をとってやればいいので、こんな関数を書いておくと便利です。

function arrayAnd(a:Array):Boolean {
	var f:Boolean = true;
	var l:int = a.length;
	for (var i:int = 0; i < l; i++) {
		f && = a[i];
	}
	return f;
}

こんな風に使います。

var a:Array=new Array(true,true,true,true,true,true,true);
trace(arrayAnd(a));
//trueが出力される

FlashPlayer10なら、新しく追加されたVectorを使うのもアリですね。

function vectorAnd(v:Vector.):Boolean{
	var f:Boolean = true;
	var l:int  v.length;
	for(var i:int = 0; i < v.length; i++){
		f && = v[i];
	}
	return f;
}

var v:Vector. = Vector.([true, true, true]);
trace(vectorAnd(v));
//trueが出力される

ポイントは論理積を求めるとき最初のフラグはtrueにしておくことです。
他にも方法としては、AS3で追加されたevery関数を使うという手もあります。

function array_is_true(item:*, index:int, array:Array):Boolean {
			return item as Boolean;
}
var a:Array=new Array(true,true,true,true,true,false);
trace(a.every(array_is_true));
//上記だと配列のひとつがfalseなので結果もfalseが返さる
  • 論理積
    • every
    • 掛け算なので一個でもゼロがあるとゼロになる
    • 全てがtrueでないとtrueを返さない
  • 論理和
    • some
    • ゼロか1しかない足し算なので一個でも1があると1になる
    • 一個でもtrueがあればtrueを返す

と自分は覚えるようにしています。

論理演算は慣れないとほんと全然わかりにくいんですが、「確か便利だったはず」とだけでも頭の片隅においておけば、使いたくなったときに調べればいいので使う場面をこうして積極的に書きとどめておくことにします。

コメントを残す

メールアドレスが公開されることはありません。