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;    }  }}
Jamal's user avatar
Jamal
35.2k13 gold badges134 silver badges238 bronze badges
askedMay 6, 2013 at 11:50
Tsuneo Yoshioka's user avatar
\$\endgroup\$
1
  • 3
    \$\begingroup\$Why don't you simply use ashim?\$\endgroup\$CommentedMay 6, 2013 at 12:02

1 Answer1

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 needtabInfoKey and you can usepush instead. Arrays are objects too.
  • Don't use console.log for production code
  • tab is a terrible name, go for either the Spartano orobject
  • info is an unfortunate name, perhapsvalue ?
  • tabInfo is 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 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.

answeredFeb 11, 2014 at 21:42
konijn's user avatar
\$\endgroup\$

You mustlog in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.