Object map in JavaScript 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;
    }
  }
}
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 &lt; 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 &lt; 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 &lt; 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.