forked from: クロージャってこういうこと? 「;」忘れの恐怖

by harupiyo forked from クロージャってこういうこと? 「;」忘れの恐怖 (diff: 128)
Flashでの複雑なデータ構造をテストしてみる(クロージャとは何の関係もありません;;)
♥0 | Line 98 | Modified 2009-12-16 18:14:29 | MIT License
play

ActionScript3 source code

/**
 * Copyright harupiyo ( http://wonderfl.net/user/harupiyo )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/38Sx
 */

// forked from coppieee's クロージャってこういうこと? 「;」忘れの恐怖
//
// Flashでの複雑なデータ構造をテストしてみる(クロージャとは何の関係もありません;;)
//
package {
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import mx.utils.ObjectUtil; // (AS3 では使えないんだな)

	public class Main extends Sprite {
        // 何かのマスターデータ
        private const MASTER:Object = { // (結合配列というのか)
        	BUILDING: {
        		PUMP: {
        		    WEAR: [0],
        		    ITEM: [1,2,3,4,5,6,7,8]
        		}
        	}
        };
        
        // 既存のユニーク値を保存
        private var unique:Array = [];
        
        public function Main() {
			createView();
			// 結合配列の中のキーにアクセスするにはこのようにする
			for(var key:String in MASTER.BUILDING.PUMP){
			    trace(key);
			}
			trace(1 == 1);
			trace([false,true,true].every( function(elm:Boolean,...a):Boolean { return elm == true; } ) );
			trace( getTestArray().filter( function(elm:Boolean,...a):Boolean { return elm; } ).length );
			/*
			trace( ObjectUtil.toString( getItems() ) );  // dump できた
			trace( getUniqueItem() );
			trace( getUniqueItem() );
			trace( ObjectUtil.toString( unique ) );
			trace( ObjectUtil.toString( test() ) );
			trace( ObjectUtil.toString( testArrayFunction() ) );
			trace( ObjectUtil.toString( [2,3,4].splice(0,1) ) );
			trace( ObjectUtil.toString( [2,3,4].splice(1,2) ) );
			*/
			
			trace( ObjectUtil.toString( compoundArray([1,3,5],[2,4]) ) );   // 配列の合成
			
			
			trace( ObjectUtil.toString( randomChoice( [1,2,3,4,5], 2 ) ) );
	    }
        
        public function getTestArray():Array {
            return [true, false, true, false, true, true, false, true];
        }
        
        // 配列の結合(こんなやり方しかないかな)
	    public function compoundArray(a1:Array, a2:Array):Array {
	        a2.forEach(
	            function (elm:*, i:int, a:Array):void {
	                a1.push(elm);
	            }
	        );
	        return a1;
	    }
	    
	    // 配列からnum 個をランダムに取得
        public function randomChoice( master:Array, num:int ):Array {
            var result:Array = [];
            for( var i:int = 0 ; i < num ; i++ ){
                var index:int = int( Math.random() * master.length );
                result.push( master[index] );
                master.splice( index, 1 ); // 一度選んだものは除外しておく
            }
            return result;
        }

		public function test():Object {
		   var o:Object = {};
		   o[ 'test' ]++;
		   return o;
    	}
    	
		public function getUniqueItem():int{
		    var i:int = getRandomItem();
		    if( isAlready( i ) ){
		        return getUniqueItem(); // 再帰
		    }else{
		        // 二度とこの値を選べないよう、取得したユニーク値を保存しておく
		        unique.push(i);
		    }
		    return i;
        }
        
        // すでにsrc の中にtarget が存在するかどうかを調べる
        public function isAlready(target:*):Boolean{
            return unique.some( function (elm:*, index:int, array:Array):Boolean { return elm == target; }  );
        }

		public function getRandomItem():int{
		    var items:Array = getItems();
		    var index:int = int(Math.random() * items.length) + 1;
		    return items[ index ];
		}
		
        public function getItems():Array {
            // a1~a3 のいずれも同じ物が取得できる
            var s:String = "BUILDING";
            var a1:Array = MASTER[ s ].PUMP.ITEM;
            var a2:Array = MASTER.BUILDING.PUMP.ITEM;
            var a3:Array = MASTER["BUILD"+"ING"]["PUMP"]["ITEM"];
            return a3;
        }
        
        // 配列の持つfilter, some を確認
        public function testArrayFunction():Array {
            var master:Array = [0,1,2,3,4,5];
            var right:Array = [2,5];    // 除外したい
            var bloomer:Array = master.filter(
                function (elm:int, index:int, a:Array):Boolean {
                    return ! right.some(
                        function (elm2:int, index2:int, a2:Array):Boolean {
                            return elm == elm2;
                        }
                    );
                }
            );
            return bloomer;
        }
        
		//なるほど、こうやってtrace の文字を出力しているのか
		private function createView():void {
			var t:TextField = new TextField();
			t.autoSize = TextFieldAutoSize.LEFT;
			addChild(t);
			trace = function(s:String):void { t.appendText(s + "\n"); };
		}
		private var trace:Function;
	}


}