带有自定义对象的 TypeScript 中的 HashMap

HashMap in TypeScript with custom object

简介

我目前正在做一个项目,我需要保存每个用户的分数。 为此我用了一个Map<User, number>来表示它。

有问题

如果我用名为 john 的用户创建地图:

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

如果我想将 John Hasherman 的分数设置为 1(自愿使用新实例而不是之前使用的实例),请使用以下代码:

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

但是 TypeScript 在 myMap 中创建了一个新元素。

问题

所以我的问题是,您知道是否可以自定义地图中使用的比较器吗?像定义 hashCode()equals(o Object)?

时的 Java

您需要一种方法让用户公开识别特定用户的功能,可能是通过名称,也可能是通过更独特的 ID。无论哪种方式,每个用户都是关键的地图不太适合这项工作,但它是可能的。

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

有点绕。如果可能,我建议考虑使用不同的数据结构。