Hi again!
Yesterday I’ve found out a cool new feature of ActionScript 3.0. You will sometimes have to use associative Arrays. The problem with these is that you can’t easily loop through them with a for-loop like
var myAssocArray:Array = [], i :int, intLength :int; myAssocArray['foo'] = 'one'; myAssocArray[1] = 'two'; myAssocArray['bar'] = 'three'; myAssocArray[0] = 'four'; intLength = myAssocArray.length; for(; i< intLength; ++i) { trace(myAssocArray[i]); }
The trace will probably print out “four, two, undefined, undefined”. The fact is that you can get the elements 0 & 1 via the variable i, but the the other keys can’t be accessed with this method.
As I also like PHP very much, I also know the function array_keys(array) of PHP, which returns the key-values of the array given in the parameters. I thought that I really need this functionality within AS3, so I tried a lot, searched the internet and finally got it! It’s pretty simple for those knowing AS2 – prototype functions.
What do we need to do? Place the following code in your main, unnamed package below or above the class-definition and you can use it everywhere else in the code:
package { public class foo { public function foo():void { trace('bar'); } } Array.prototype.arrayKeys = function():Array { var arrReturn :Array = [], strKey :String; for(strKey in this) { if(typeof this[strKey] == 'function') continue; trace('in Array:: value->'+ strKey +' typeOf:'+ typeof strKey +' proto:'+ ((this[strKey] !== false) ? typeof this[strKey] : 'NULL')); arrReturn[arrReturn.length] = strKey; } return arrReturn; } Number.prototype.give = function():String { return 'Number::giveItToMeBaby'; } }
You can now use this method to get the keys of the variable:
var arrKeys :Array = myAssocArray.arrayKeys(), i :int, intLength :int = arrKeys.length; for(; i < intLength; ++i) { trace(myAssocArray[arrKeys[i]]); }
Pretty easy, isn't it? Well, it is easy because the native Array-Class is dynamic, but what do we do with Number (final class)? Let's see...
var num:Number = 4; num.give(); //doesn't work! final class, can't add methods to it? num['give'](); //does work :) you can dynamically add methods to a class even if it's final; problem is that this code is hard to read, but it actually works
So far...
Daniel
