HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavascriptMinor

Object map in JavaScript

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
javascriptobjectmap

Problem

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;
    }
  }
}

Solution

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.

Code Snippets

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;
    }
  }
}
o = new ObjectMap();
o.set( o , "123" );
o.get( o ); //Gives "123"
o.remove( o );
o.get( o ); //Gives nothing

Context

StackExchange Code Review Q#25868, answer score: 5

Revisions (0)

No revisions yet.