I want to make a map object that key is object.
But, JavaScript only allows string as a hash key. (at least before ECMAScript6 comes?)
So, I tried to write auxiliary functions to emulate, hash-ish (but actually linear search).Are there any suggestions on improvement?
var tabInfo = {};var tabInfoKey = 0;function getTabInfoItem(tab) { console.log("getTabInfoItem", tab); for(var key in tabInfo) { if(tabInfo[key].tab === tab) { return tabInfo[key].info; } }}function setTabInfoItem(tab, info) { console.log("setTabInfoItem", tab, info); for(var key in tabInfo) { if(tabInfo[key].tab === tab) { tabInfo[key] = { tab: tab, info: info }; return; } } tabInfoKey++; tabInfo[tabInfoKey] = { tab: tab, info: info };}function deleteTabInfoItem(tab) { console.log("deleteInfoItem", tab); for(var key in tabInfo) { if(tabInfo[key].tab === tab) { delete tabInfo[key]; return; } }}- 3\$\begingroup\$Why don't you simply use ashim?\$\endgroup\$Florian Margaine– Florian Margaine2013-05-06 12:02:52 +00:00CommentedMay 6, 2013 at 12:02
1 Answer1
I can't see a good use for this, but nonetheless:
- Since you treat tabInfo as a list, why not have it be an array, this way you don't need
tabInfoKeyand you can usepushinstead. Arrays are objects too. - Don't use console.log for production code
tabis a terrible name, go for either the Spartanoorobjectinfois an unfortunate name, perhapsvalue?tabInfois also meh, perhapsobjectMap?- you should have a constructor for this!
Something like this incorporates my feedback:
function ObjectMap() { this.entries = [];}ObjectMap.prototype.get = function( object ) { for( var i = 0 , length = this.entries.length ; i < length ; i++ ){ if( this.entries[i].object === object ){ return this.entries[i].value; } }}ObjectMap.prototype.set = function( object, value ) { //If we can find it, update it for( var i = 0 , length = this.entries.length ; i < length ; i++ ){ if( this.entries[i].object === object ){ this.entries[i].value = value; return; } } //Otherwise, generate an entry this.entries.push( { object : object , value : value } );}ObjectMap.prototype.remove = function( object ) { for( var i = 0 , length = this.entries.length ; i < length ; i++ ){ if( this.entries[i].object === object ){ this.entries.splice( i , 1 ); return; } }}You can then
o = new ObjectMap();o.set( o , "123" );o.get( o ); //Gives "123"o.remove( o );o.get( o ); //Gives nothingFurthermore you should consider whether you want to allow function chaining, right now none of these functions return anything and it seems a shame.
You mustlog in to answer this question.
Explore related questions
See similar questions with these tags.