0

介绍

我目前在项目中工作,我需要保存每个用户的分数。为此,我用 aMap<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 中创建了一个新元素。

问题

所以我的问题是,你知道是否可以自定义地图内使用的比较器?像 Java 一样定义hashCode()and equals(o Object)?

4

1 回答 1

1

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

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

这有点令人费解。如果可能的话,我建议考虑不同的数据结构。

于 2022-02-18T21:17:04.710 回答