Skip to content

Instantly share code, notes, and snippets.

@KoryNunn
Last active December 10, 2015 20:39
Show Gist options
  • Select an option

  • Save KoryNunn/4489918 to your computer and use it in GitHub Desktop.

Select an option

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.
(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