package laya.utils {
/**
* <code>Dictionary</code> 是一個字典型的數據存取類。
*/
public class Dictionary {
private var _values:Array = [];
private var _keys:Array = [];
/**
* 獲取所有的子元素列表。
*/
public function get values():Array {
return _values;
}
/**
* 獲取所有的子元素鍵名列表。
*/
public function get keys():Array {
return _keys;
}
/**
* 給指定的鍵名設置值。
* @param key 鍵名。
* @param value 值。
*/
public function set(key:*, value:*):void {
var index:int = indexOf(key);
if (index >= 0) {
_values[index] = value;
return;
}
_keys.push(key);
_values.push(value);
}
/**
* 獲取指定對象的鍵名索引。
* @param key 鍵名對象。
* @return 鍵名索引。
*/
public function indexOf(key:Object):int {
var index:int = _keys.indexOf(key);
if (index >= 0) return index;
key = (key is String) ? Number(key) : ((key is Number) ? key.toString() : key);
return _keys.indexOf(key);
}
/**
* 返回指定鍵名的值。
* @param key 鍵名對象。
* @return 指定鍵名的值。
*/
public function get(key:*):* {
var index:int = indexOf(key);
return index < 0 ? null : _values[index];
}
/**
* 移除指定鍵名的值。
* @param key 鍵名對象。
* @return 是否成功移除。
*/
public function remove(key:*):Boolean {
var index:int = indexOf(key);
if (index >= 0) {
_keys.splice(index, 1);
_values.splice(index, 1);
return true;
}
return false;
}
/**
* 清除此對象的鍵名列表和鍵值列表。
*/
public function clear():void {
_values.length = 0;
_keys.length = 0;
}
}
}
上面源代碼可以看到indexOf方法的效率很差。參考引擎自帶的Dictionary為什么不直接使用as的Dictionary類,官方給出的答復是"因為LayaAir運行出來的是js。即便是AS3版本,最終運行在瀏覽器的也是js。而js中沒有Dictionary"
這一點和AS3是一樣的,就是Object只能以string作為key,但是Dictionary可以把Object來做為key。如果我們沒有Object作為key的需求,還是用Object效率會好一些。
end