代码之家  ›  专栏  ›  技术社区  ›  Forseti

在typescript中重新实现映射

  •  0
  • Forseti  · 技术社区  · 7 年前

    由于我需要一个映射,其中一个键不仅与值关联,而且与一些元数据(如“weight”或“timetolive”)关联,所以我试图使用类似于 class MdaMap<M, K, V> extends Map<K, AugmValue<V, M>> . 回答如下 Implementing ES6 Map augmented with metadata in Typescript 这不是个好办法。第二个选项是围绕地图的包装对象,但感觉像meh。所以我想到了第三个选择:重新实现地图。

    所以我创建了一个类,它必须保存三种类型的记录:键、值和元数据。

    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。需要在数组中循环,直到找到给定的键。区别似乎在于访问键、值或元数据的便利性,否则我怀疑tuple在资源上更容易使用。

    至于3。当然,我必须记住在所有三个数组中设置和删除元素,这没问题。但我想知道,如果mdamap位于共享对象中,那么 keys , values metadata 如果同时调用 set(k: K, v: V, m: M): void 并且 del(k: K): void ?

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Matt Dillard    7 年前

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