Sunday, May 12, 2024
 Popular · Latest · Hot · Upcoming
59
rated 0 times [  65] [ 6]  / answers: 1 / hits: 39763  / 7 Years ago, thu, july 6, 2017, 12:00:00

Looking at a couple of different docs, all I see is when the Map (ECMAScript6) 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
}


https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/has


More From » dictionary

 Answers
13

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.


[#57190] Tuesday, July 4, 2017, 7 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
aden

Total Points: 369
Total Questions: 100
Total Answers: 83

Location: Australia
Member since Tue, Oct 19, 2021
3 Years ago
;