0

Introduction

I am currently work in project that I need to save the score of each user. For this I used a Map<User, number> to represent it.

Problematic

If I create map with a user named john:

let myMap: Map<User, number> = new Map();
myMap.set(new User("John","Hasherman"), 0);

And if I want to set John Hasherman’s score to 1 (voluntarily using a new instance and not the one previously used), with this code:

myMap.set(new User("John","Hasherman"), 1);

But TypeScript create a new element inside myMap.

Question

So my question is, do you know if it’s possible to customize the comparator used inside the map? like Java when defining hashCode() and equals(o Object)?

Aluan Haddad
  • 29,886
  • 8
  • 72
  • 84
ThrowsError
  • 1,169
  • 1
  • 11
  • 43
  • 1
    Does this answer your question? [Overriding the equality function of a Javascript Map](https://stackoverflow.com/questions/53051344/overriding-the-equality-function-of-a-javascript-map) – Jeff Bowman Feb 18 '22 at 21:15

1 Answers1

1

You'll need a way for the User to expose functionality that will identify a particular user, perhaps by name, or perhaps by a more unique ID. Either way, a Map where each user is the key isn't very suited to the job, but it's possible.

class User {
    public first: string;
    public last: string;
    constructor(first: string, last: string) {
        this.first = first;
        this.last = last;
    }
}

const myMap: Map<User, number> = new Map();
myMap.set(new User("John","Hasherman"), 0);

// to set John's value to 1:
const foundJohn = [...myMap.keys()].find(
    obj => obj.first === 'John' && obj.last === 'Hasherman'
);
if (foundJohn) {
    myMap.set(foundJohn, 1);
}

It's somewhat convoluted. I'd suggest considering a different data structure if possible.

CertainPerformance
  • 356,069
  • 52
  • 309
  • 320
  • 2
    Indeed, unlike Java here the map is not very appropriate. – ThrowsError Feb 18 '22 at 21:25
  • Yes, a different data structure is the right call here, especially since you lose the [O(1) complexity](https://stackoverflow.com/q/33611509/1426891) of Set and Map access and get array-scan O(n) complexity instead. This frequently defeats the purpose of using Set and Map, due to the uncertain performance. – Jeff Bowman Feb 22 '22 at 21:53