kuri.がやろうとしていることをやってみた。

まぁ結論として、adobeがhashクラスを作ってくれれば良いんだよな。うん。

結合配列と配列の両方の特性を使いたいなー。

actionscript3.0で結合配列に追加した順番でいろいろ操作したい

かなりの妥協だけど、結合配列のobjectを読み込んでkeyをarrayに突っ込むクラスを作れば良い、と思うんだ。

調べてないから保障はできないけど、とりあえず結合配列に突っ込んだ値は追加した順になってるっぽい。

かなり適当だけど、push, pop, unshift, shiftを実装したソース貼り付けてみる。

package CustomHash {
	public dynamic class CustomHash extends Object {

		private var array:Array = new Array();

		public function CustomHash(obj:Object = null) {
			if (obj != null) {
				for (var key:String in obj) {
					this[key] = obj[key];
					array.push(key);
				}
			}
		}

		public function push(obj:Object):void {
			if (obj != null) {
				for (var key:String in obj) {
					this[key] = obj[key];
					array.push(key);
				}
			}
		}

		public function pop():void {
			var key:String = array.pop();
			delete this[key];
		}

		public function unshift(obj:Object):void {
			if (obj != null) {
				for (var key:String in obj) {
					this[key] = obj[key];
					array.unshift(key);
				}
			}
		}

		public function shift():String {
			var key:String = array.shift();
			var value:String;

			value = this[key];
			delete this[key];

			return value;
		}

		public function length():int {
			var i:int = 0;
			for (var key:String in this) {
				i++;
			}
			return i;
		}

		public function debug():void {
			var i:int = 0;
			for (i=0; i < array.length; i++) {
				trace(array[i] + " => " + this[array[i]]);
			}
		}
	}
}
import CustomHash;

private function init():void{
	var obj:Object = new Object();
	obj["key1"] = "value1";
	obj["key2"] = "value2";
	obj["key3"] = "value3";

	trace("-----constructer");

	var hash:CustomHash = new CustomHash(obj);

	hash.debug();

	trace("-----push");

	obj = new Object();
	obj["key4"] = "value4";
	obj["key5"] = "value5";

	hash.push(obj);
	hash.debug();

	trace("-----pop");

	hash.pop();
	hash.debug();

	trace("-----unshift");

	obj = new Object();
	obj["key6"] = "value6";
	obj["key7"] = "value7";

	hash.unshift(obj);
	hash.debug();

	trace("-----shift");

	trace(hash.shift());
	hash.debug();
}

使用結果。

-----constructer
key1 => value1
key2 => value2
key3 => value3
-----push
key1 => value1
key2 => value2
key3 => value3
key4 => value4
key5 => value5
-----pop
key1 => value1
key2 => value2
key3 => value3
key4 => value4
-----unshift
key7 => value7
key6 => value6
key1 => value1
key2 => value2
key3 => value3
key4 => value4
-----shift
value7
key6 => value6
key1 => value1
key2 => value2
key3 => value3
key4 => value4

pushとかunshift時には追加するobjectを一度初期化してから結合配列にしたものを突っ込むようにしないといけないのが面倒くさいところか・・・。

objectとしての塊で追加できるところは便利かもしれない。。。

と言うかobject作るワンクッションが面倒くさい、くさすぎる!


今はdebugがarrayの昇順で表示してるけど降順も可、と言う事になるわな。

kuri.ならもっと良いもの作れる・・・!きっと!