重新以Typescript

时间:2018-10-02 20:51:32

标签: arrays typescript dictionary

由于我需要一个不仅键与值关联而且还与某些元数据关联的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代表元数据。现在,问题是:哪种数据结构最好。我看到以下解决方案:

  1. 元组数组:

    private store: [K, V, M][];
    
  2. 对象数组:

    private store: {key: K, value: V, metadata: M}[]
    
  3. 3个数组:

    private keys: K[];
    private values: V[];
    private metadata: M[];
    

解决方案1.和2.需要遍历数组,直到找到给定的键为止。区别似乎是在访问键,值或元数据时很方便-否则我怀疑元组在资源上更容易。

至于3。当然,我必须记住要设置和删除所有三个数组中的元素,这没问题。但我想知道是否有可能将MdaMap放在共享对象中,如果说keysvaluesmetadata数组是否可以不同步,则同时调用了set(k: K, v: V, m: M): voiddel(k: K): void

您认为最佳方法是什么?为什么?

1 个答案:

答案 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']);