forked from: クロージャってこういうこと? 「;」忘れの恐怖
forked from クロージャってこういうこと? 「;」忘れの恐怖 (diff: 128)
Flashでの複雑なデータ構造をテストしてみる(クロージャとは何の関係もありません;;)
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;
}
}
