var Map = function() { this.keys = []; this.items = new Object() } // PUT Map.prototype.put = function(key, value) { if (!(key in this.items)) { this.keys.push(key) } this.items[key] = value; } Map.prototype.putAll = function(obj) { for(item in obj) { this.put(item, obj[item]) } } // GET Map.prototype.get = function(key) { return this.items[key] } Map.prototype.getItems = function() { return this.items } Map.prototype.getKeys = function() { return this.keys } // OTHER Map.prototype.size = function() { return this.keys.length } Map.prototype.isEmpty = function() { return (this.keys.length == 0) } Map.prototype.containsKey = function(key) { return (this.items[key] !== undefined) } Map.prototype.clear = function() { this.keys = []; this.items = new Object() } // CLONE POLYFILL Object.prototype.clone = function() { var newObj = (this instanceof Array) ? [] : {}; for (var i in this) { if (i == 'clone') continue; if (this[i] && typeof this[i] == "object") { newObj[i] = this[i].clone(); } else { newObj[i] = this[i]; } } return newObj; } var myMap = new Map() myMap.put("firstItem", true) myMap.put("secondItem", "doesn't matter") myMap.put("firstItem", "hello world!") myMap.putAll({"thirdItem": 1, "forthItem": 92.123}) var items = myMap.getItems() var item = myMap.get("firstItem") var contains = myMap.containsKey("firstItem") var keys = myMap.getKeys() var size = myMap.size() var copy = myMap.clone() copy.put("firstItem", false) var clone = copy.getItems() var cloneKeys = copy.getKeys() var clear = myMap.clear() var shouldBeZero = myMap.size() console.log(items) // { "firstItem" : true, "secondItem": "doesn't matter" } console.log(item) // "hello world!" console.log(contains) // true console.log(keys) // [ "firstItem", "secondItem" ] console.log(size) // 2 console.log(clone) // { "firstItem" : false, "secondItem": "doesn't matter" } console.log(cloneKeys) // [ "firstItem", "secondItem" ] console.log(shouldBeZero) // 0