4
\$\begingroup\$

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; } } } 
\$\endgroup\$
1
  • 3
    \$\begingroup\$Why don't you simply use a shim?\$\endgroup\$CommentedMay 6, 2013 at 12:02

1 Answer 1

5
\$\begingroup\$

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 tabInfoKey and you can use push instead. Arrays are objects too.
  • Don't use console.log for production code
  • tab is a terrible name, go for either the Spartan o or object
  • info is an unfortunate name, perhaps value ?
  • tabInfo is also meh, perhaps objectMap ?
  • 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 nothing 

Furthermore you should consider whether you want to allow function chaining, right now none of these functions return anything and it seems a shame.

\$\endgroup\$

    Start asking to get answers

    Find the answer to your question by asking.

    Ask question

    Explore related questions

    See similar questions with these tags.