【问题标题】:Re-implementing a Map in Typescript在 Typescript 中重新实现地图
【发布时间】:2019-03-08 01:04:39
【问题描述】:

由于我需要一个 Map,其中键不仅与值相关联,还与一些元数据相关联 - 例如“权重”或“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): void 和 @ 987654331@?

您认为最好的方法是什么?为什么?

【问题讨论】:

    标签: arrays typescript dictionary


    【解决方案1】:

    你不需要重新实现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']);
    

    【讨论】:

      猜你喜欢
      • 2017-12-03
      • 1970-01-01
      • 2016-08-31
      • 2020-02-13
      • 2022-06-23
      • 2021-12-29
      • 2020-11-03
      • 1970-01-01
      • 2016-03-13
      相关资源
      最近更新 更多