由于我需要一个不仅键与值关联而且还与某些元数据关联的Map,例如“ weight”或“ timeToLive”,因此我试图使用class MdaMap<M, K, V> extends Map<K, AugmValue<V, M>>
之类的基于Map的结构。正如Implementing ES6 Map augmented with metadata in Typescript中回答的那样,这不是一个好方法。第二个选择是围绕Map的包装对象,但感觉像是meh。所以我想到了第三个选择:重新实现Map。
因此,我制作了一个必须包含3种记录的类:键,值和元数据。
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.需要遍历数组,直到找到给定的键为止。区别似乎是在访问键,值或元数据时很方便-否则我怀疑元组在资源上更容易。
至于3。当然,我必须记住要设置和删除所有三个数组中的元素,这没问题。但我想知道是否有可能将MdaMap放在共享对象中,如果说keys
,values
和metadata
数组是否可以不同步,则同时调用了set(k: K, v: V, m: M): void
和del(k: K): void
?
您认为最佳方法是什么?为什么?
答案 0 :(得分:0)
您无需重新实现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']);