Associative Arrays in JavaScript
Some developers misuse the Array
constructor to create an associative array. However, this is not a good way of doing this as all the methods/properties available to an array (length, index, sort etc) will not work.
var foo = []; // [] is the same as 'new Array()' foo["bar"] = "baz"; alert(foo.length);
When the alert fires, it will return '0' instead of '1'.
As it doesn't function as a proper array, you may as well use an object instead:
var foo = {}; // {} is the same as 'new Object()' foo["bar"] = "baz";
However, you can't see how many items there are without looping through the object. I have written a simple class that can be used that offers this (through the function 'getSize()' as well as a few other methods). As a result, you can't have anything with the keys 'getSize', 'remove', 'toString' and 'toArray'.
var AssociativeArray = function() { if(arguments.length == 1 && arguments[0].constructor == Object) { for(var item in arguments[0]) { this[item] = arguments[0][item]; } } this.getSize = function() { var length = 0; for(var item in this) { if(item in new this.constructor === false) { length++; } } return length; } this.remove = function(item) { if(item in new this.constructor === false) { delete this[item]; } } this.toString = function() { return this.toArray().toString(); } this.toArray = function() { var output = []; for(var item in this) { if(item in new this.constructor === false) { output[output.length] = item + "=" + this[item]; } } return output; } }
To use this is pretty simple:
var foo = new AssociativeArray(); foo["one"] = 1; foo["two"] = new Date(); foo["three"] = "A string"; // the above can also be done like this: // var foo = new AssociativeArray({"one":1,"two":new Date(),"three":"A string"}); alert(foo); // alerts a comma separated string containing the items added alert(foo.getSize()); // alerts the size (i.e. 3) foo.remove("one"); // remove item 'one' alert(foo.getSize()); // alerts the new size (i.e. 2) var ar = foo.toArray().sort(); // sorted array (by key)
Comments