Search code examples
javascriptdictionaryes6-map

How to check if JavaScript Map has an object key


Looking at a couple of different docs, all I see is when the Map (ECMAScript 6) key is a boolean, string, or integer. Is there a way we could use another customized Object (called with the new CustomObject(x,y) constructor call) to be added as a key?

I am able to add an object as a key, but unable to check if the Map has the said object:

var myMap = new Map();
myMap.set( new Tuple(1,1), "foo");
myMap.set('bar', "foo");


myMap.has(?);  
myMap.has('bar');  // returns true

Is there a way around this?

  var myMap = new Map();
  myMap.set( new Tuple(1,1), "foo");

 for(some conditions) {
 var localData = new Tuple(1,1); //Use directly if exists in myMap? 
 map.has(localData) // returns false as this is a different Tuple object. But I need it to return true
}

Solution

  • You just have to save the reference to the object:

    var myMap = new Map();
    var myKey = new Tuple(1,1);
    myMap.set( myKey, "foo");
    myMap.set('bar', "foo");
    
    myMap.has(myKey);           // returns true;  myKey === myKey
    myMap.has(new Tuple(1,1));  // returns false; new Tuple(1,1) !== myKey
    myMap.has('bar');           // returns true;  'bar' === 'bar'
    

    Edit: Here is how to use an object to achieve what you want, which is to compare objects by their values rather than by reference:

    function Tuple (x, y) {
      this.x = x;
      this.y = y;
    }
    Tuple.prototype.toString = function () {
      return 'Tuple [' + this.x + ',' + this.y + ']';
    };
    
    var myObject = {};
    myObject[new Tuple(1, 1)] = 'foo';
    myObject[new Tuple(1, 2)] = 'bar';
    console.log(myObject[new Tuple(1, 1)]); // 'foo'
    console.log(myObject[new Tuple(1, 2)]); // 'bar'
    

    These operations will run in constant time on average, which is much faster than searching through a Map for a similar object key in linear time.