Photo by flattop341
Sometimes its good to have the right tools. One of my favorite classes in my Java days was the Hashtable class. It allowed you to store objects based on a key id. ActionScript somewhat allows the same with the Array object such as myArray[’myKey’] = myObject, but it does not allow for the same amount of robust tools as the Hashtable.
I written a Javascript, as2, and and as3 version of the Hashtable and still use it today. I thought it might be a good tool for someone’s toolbelt and thought I would share it. I have added some casting methods that are common such as nested DataContainers, MovieClips, Strings. etc. However, you can always extend this class to add more.
It works well when you have nested collections.
DataContainer Class
<br />
/***************************************************************<br />
* DataContainer Object<br />
*<br />
* This Class is used to store objects with a string key<br />
*<br />
* Company: NovoLogic<br />
* Developer: Kevin E. Crawford<br />
* Email: kcrawford@novologic.com<br />
*<br />
***************************************************************/<br />
package novologic.collections<br />
{<br />
// imports<br />
import flash.display.MovieClip;<br />
import flash.display.Sprite;</p>
<p>/**<br />
* NovoLogic DataContainer Class<br />
* This Class is used to store objects with a string key<br />
* @author Kevin Crawford<br />
* @version 1.0.0<br />
*<br />
*/<br />
public class DataContainer extends Object<br />
{<br />
// Object Internal Variables<br />
private var _container:Array;<br />
private var _keys:Array;</p>
<p>/**<br />
* Constructor for Class<br />
*/<br />
public function DataContainer()<br />
{<br />
this.container = new Array();<br />
this.keys = new Array();<br />
}<br />
/**<br />
* Sets value for key value pair passed<br />
*<br />
* @param key:String<br />
* @param value:Object<br />
* @retrun void<br />
*/<br />
public function put(key:String, value:*):void<br />
{<br />
if ((key != null) && (value != null))<br />
{<br />
if (!this.contains(key))<br />
{<br />
this.keys[this.keys.length] = key.toLowerCase();<br />
}<br />
this.container[key.toLowerCase()] = value;<br />
}<br />
}</p>
<p>/**<br />
* gets array for iteration<br />
*<br />
* @retrun Array<br />
*/<br />
public function getArray():Array<br />
{<br />
return this.container;<br />
}</p>
<p>/**<br />
* gets value for the provided key as an Object<br />
*<br />
* @param key:String<br />
* @retrun Object<br />
*/<br />
public function get(key:String):*<br />
{<br />
return this.container[key.toLowerCase()];<br />
}</p>
<p>/**<br />
* gets value for the provided key as a String<br />
*<br />
* @param key:String<br />
* @retrun String<br />
*/<br />
public function getAsString(key:String):String<br />
{<br />
var str:String;<br />
try<br />
{<br />
str = String(this.get(key));<br />
}<br />
catch (e:Error)<br />
{<br />
str = ""<br />
}<br />
return str;<br />
}</p>
<p>/**<br />
* gets value for the provided key as a Number<br />
*<br />
* @param key:String<br />
* @retrun Number<br />
*/<br />
public function getAsNumber(key:String):Number<br />
{<br />
var num:Number;<br />
try<br />
{<br />
num = Number(this.get(key));<br />
}<br />
catch (e:Error) {<br />
num = 0;<br />
}<br />
return num;<br />
}</p>
<p>/**<br />
* gets value for the provided key as a Sprite<br />
*<br />
* @param key:String<br />
* @retrun Sprite<br />
*/<br />
public function getAsSprite(key:String):Sprite<br />
{<br />
var obj:Sprite;<br />
try<br />
{<br />
obj = Sprite(this.get(key));<br />
}<br />
catch (e:Error)<br />
{<br />
obj = new Sprite();<br />
}<br />
return obj;<br />
}</p>
<p>/**<br />
* gets value for the provided key as a MovieClip<br />
*<br />
* @param key:String<br />
* @retrun MovieClip<br />
*/<br />
public function getAsMC(key:String):MovieClip<br />
{<br />
var obj:MovieClip;<br />
try<br />
{<br />
obj = MovieClip(this.get(key));<br />
}<br />
catch (e:Error)<br />
{<br />
obj = new MovieClip();<br />
}<br />
return obj;<br />
}</p>
<p>/**<br />
* Gets value for the provided key. If there is nothing stored for given key, then obj is stored as default and returned.<br />
*<br />
* @param key:String<br />
* @param obj:Object<br />
* @retrun Object<br />
*/<br />
public function getCreate(key:String, obj:Object):Object<br />
{<br />
var value:String = "";<br />
if (!this.contains(key))<br />
{<br />
this.put(key, obj);<br />
}<br />
value = this.container[key.toLowerCase()];<br />
return value;<br />
}</p>
<p>/**<br />
* gets value for the provided key as a DataContainer<br />
*<br />
* @param key:String<br />
* @return DataContainer<br />
*/<br />
public function getAsDC(key:String):DataContainer<br />
{<br />
var obj:DataContainer;<br />
try<br />
{<br />
obj = DataContainer(this.get(key));<br />
}<br />
catch (e:Error)<br />
{<br />
obj = new DataContainer();<br />
}<br />
return obj;<br />
}</p>
<p>/**<br />
* Returns keys Array<br />
* @return Array<br />
*/<br />
public function getKeys():Array<br />
{<br />
return this.keys;<br />
}</p>
<p>/**<br />
* Returns boolean indicating the DataContainer has data stored for provided key<br />
* @param key:String<br />
* @return Boolean<br />
*/<br />
public function contains(key:String):Boolean<br />
{<br />
return (this.container[key.toLowerCase()] != undefined);<br />
}</p>
<p>/**<br />
* Returns Boolean indicating if the DataContainer is empty of all data.<br />
* @return Boolean<br />
*/<br />
public function isEmpty():Boolean<br />
{<br />
return (this.keys.length == 0);<br />
}</p>
<p>/**<br />
* Clears all data from DataContainer<br />
* @return void<br />
*/<br />
public function empty():void<br />
{<br />
this.container = new Array();<br />
this.keys = new Array();<br />
}</p>
<p>/**<br />
* Getter for container Array<br />
* @return Array<br />
* */<br />
public function get container():Array<br />
{<br />
if (_container == null)<br />
_container = new Array();<br />
return _container;<br />
}<br />
/**<br />
* Setter for container Array<br />
* @param obj:Array<br />
* @return void<br />
* */<br />
public function set container(obj:Array):void<br />
{<br />
_container = obj;<br />
}</p>
<p>/**<br />
* Getter for keys Array<br />
* @return Array<br />
* */<br />
private function get keys():Array<br />
{<br />
if (_keys == null)<br />
_keys = new Array();<br />
return _keys;<br />
}<br />
/**<br />
* Setter for keys Array<br />
* @param obj:Array<br />
* @return void<br />
* */<br />
private function set keys(obj:Array):void<br />
{<br />
_keys = obj;<br />
}<br />
}<br />
}<br />
Example
<br />
var dc:DataContainer = new DataContainer();<br />
dc.put("jeff",new Object());<br />
dc.put("kevin", new Object());<br />
dc.put("ben", new Object());<br />
for (each obj:Object in dc.getArray()) {<br />
trace(obj.toString());<br />
}<br />





