Typescript,使用hashcode和equal函数的HashMap



我正在编写一个typescript浏览器游戏。

我需要存储一个int vector3(地图位置(作为地图键。

由于我们不能将引用类型存储到typescript Object和Map的键中。(我的意思是,我们可以使用Map,但如果没有相同的参考,就无法查找(

互联网上也有一些解决方案,比如嵌套映射或字符串键。

我想找到一个使用hashcode和equals的更优雅的解决方案。

是否有任何建议的解决方案或npm库?

尽管我在互联网上发现的东西无法轻易回答这个问题,但我分享了一个快速实现,它借鉴了Python的经验(未经过充分测试(。

这个想法是让Hashable.hash()函数返回一个numberstring,让HashableMap知道关键对象何时实际相同。

export interface Hashable {
hash(): InnerHashKey;
}
export class HashableMap<K extends Hashable, V> extends Map<K, V> {
private readonly _innerMap: InnerMap<K, V> = new InnerMap<K, V>();
// Map<K, V> interface overload.
public get(key: K): V | undefined {
return this._innerMap.get(key.hash())?.value;
}
public has(key: K): boolean {
return this._innerMap.has(key.hash());
}
public set(key: K, value: V): this {
this._innerMap.set(key.hash(), {key: key, value: value});
return this;
}
public delete(key: K): boolean {
return this._innerMap.delete(key.hash());
}
public get size(): number {
return this._innerMap.size;
}
public forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void {
this._innerMap.forEach((value: InnerValue<K, V>): void => callbackfn(value.value, value.key, thisArg));
}
public entries(): IterableIterator<[K, V]> {
return Array.from(this._innerMap.values()).map((value: InnerValue<K, V>): [K, V] => [value.key, value.value]).values();
}
public keys(): IterableIterator<K> {
return Array.from(this._innerMap.values()).map((value: InnerValue<K, V>): K => value.key).values();
}
public values(): IterableIterator<V> {
return Array.from(this._innerMap.values()).map((value: InnerValue<K, V>): V => value.value).values();
}
public clear(): void {
this._innerMap.clear();
}
}
type InnerHashKey = any;
type InnerValue<K, V> = {key: K, value: V};
class InnerMap<K, V> extends Map<InnerHashKey, InnerValue<K, V>> {}

最新更新