-
-
Save KoryNunn/4489918 to your computer and use it in GitHub Desktop.
A Sorta Kinda Map object. Use anything as a key, retrieves the associated value. Not as fast as a real map, but faster than an array.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (function(){ | |
| //*********************************************** | |
| // | |
| // A Sorta Kinda Map object | |
| // | |
| //*********************************************** | |
| function fastEach(array, callback) { | |
| for (var i = 0; i < array.length; i++) { | |
| if(callback(array[i], i, array)) break; | |
| } | |
| return array; | |
| }; | |
| function addToMap(key, value, store){ | |
| if(key == null){ | |
| throw "A non-null or undefined key is required"; | |
| return; | |
| } | |
| var reference, | |
| type = typeof key, | |
| constructor; | |
| reference = store[type] = store[type] || {}; | |
| if(type === 'object'){ | |
| constructor = key.__proto__.constructor.name; | |
| reference = reference[constructor] = reference[constructor] || []; | |
| }else{ | |
| reference = reference[key] = reference[key] || []; | |
| } | |
| reference.push({key:key, value:value}); | |
| }; | |
| function getFromMap(key, store){ | |
| var reference, | |
| type = typeof key, | |
| constructor, | |
| result; | |
| reference = store[type]; | |
| if(!reference){ | |
| return undefined; | |
| } | |
| if(type === 'object'){ | |
| constructor = key.__proto__.constructor.name; | |
| reference = reference[constructor]; | |
| }else{ | |
| reference = reference[key]; | |
| } | |
| if(!reference){ | |
| return undefined; | |
| } | |
| fastEach(reference, function(item){ | |
| if(item.key === key){ | |
| result = item.value; | |
| return true; | |
| } | |
| }); | |
| return result; | |
| }; | |
| function MapCtor(){ | |
| var store = {}; | |
| function Map(){ | |
| } | |
| Map.prototype.constructor = Map; | |
| Map.prototype.add = function(key, value){ | |
| return addToMap(key, value, store); | |
| }; | |
| Map.prototype.get = function(key){ | |
| return getFromMap(key, store); | |
| }; | |
| return new Map; | |
| } | |
| window.Map = function Map(){ | |
| return MapCtor(); | |
| } | |
| })(); | |
| var map = new window.Map(), | |
| tests=[ | |
| { | |
| key:{}, value: "plain object" | |
| }, | |
| { | |
| key:{}, value: "diferent plain object" | |
| }, | |
| { | |
| key:1, value: 1 | |
| }, | |
| { | |
| key:"1", value: "1" | |
| }, | |
| { | |
| key: new Date(), value: "new Date()" | |
| } | |
| ]; | |
| tests.forEach(function(test){ | |
| map.add(test.key, test.value); | |
| }); | |
| tests.forEach(function(test){ | |
| console.log(map.get(test.key) === test.value); | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment