由于我需要一个映射,其中一个键不仅与值关联,而且与一些元数据(如“weight”或“timetolive”)关联,所以我试图使用类似于 class MdaMap<M, K, V> extends Map<K, AugmValue<V, M>> . 回答如下 Implementing ES6 Map augmented with metadata in Typescript 这不是个好办法。第二个选项是围绕地图的包装对象,但感觉像meh。所以我想到了第三个选择:重新实现地图。
class MdaMap<M, K, V> extends Map<K, AugmValue<V, M>>
所以我创建了一个类,它必须保存三种类型的记录:键、值和元数据。
class MdaMap<K, V, M> {
k表示键,v表示值,m表示元数据。现在,问题是:什么数据结构最好。我看到以下解决方案:
元组数组:
private store: [K, V, M][];
对象数组:
private store: {key: K, value: V, metadata: M}[]
3个数组:
private keys: K[]; private values: V[]; private metadata: M[];
解决方案1。2。需要在数组中循环,直到找到给定的键。区别似乎在于访问键、值或元数据的便利性,否则我怀疑tuple在资源上更容易使用。
至于3。当然,我必须记住在所有三个数组中设置和删除元素,这没问题。但我想知道,如果mdamap位于共享对象中,那么 keys , values 和 metadata 如果同时调用 set(k: K, v: V, m: M): void 并且 del(k: K): void ?
keys
values
metadata
set(k: K, v: V, m: M): void
del(k: K): void
你认为最好的方法是什么?为什么?
你不需要重新实施 Map ;只需将它与元组一起使用作为内容:
Map
private store: Map<K, [V, M]>;
现在,您仍然可以使用键索引到地图中,然后从返回的内容中剥离出值或元数据。
private store = new Map<string, [number, string]>(); store.set('duck', [1.50, 'yellow']); store.set('firetruck', [8.49, 'red']);