1

假设我们在 JS 中有一张地图,如下所示。

const someMap = new Map();

someMap.set(["Jack", "Mathematics"], "Fee=₹120000");
someMap.set(["Alyne", "Science"], "Fee=₹90000");


// Going to be undefined because the lists are compared by ===
console.log(someMap.get(["Jack", "Mathematics"]));

由于比较,这阻止了我们动态检查映射中的键===。我能想到的一种方法是将其转换为类似字符串"Jack, Mathematics",然后将其用作键。但这看起来并不完美。

表示列表键的最佳方法是什么?最好的方式,我的意思是我们保留键的列表结构的方式。假设我们正在将列表转换["adog", "isananimal"]为字符串"adog,isananimal",并且还有另一个列表["adog,isananimal"]转换为相同的字符串"adog,isananimal",这会在检索值时造成混淆。

4

1 回答 1

3

字符串化仍然是最直接的方法。如果您不喜欢它的含义,您可以在扩展的自定义类中隐藏实现细节Map

class ArrayKeyedMap extends Map {
  get(array) {
    return super.get(this.#toKey(array));
  }
  
  set(array, value) {
    return super.set(this.#toKey(array), value);
  }
  
  has(array) {
    return super.has(this.#toKey(array));
  }
  
  delete(array) {
    return super.delete(this.#toKey(array));
  }
  
  #toKey(array) {
    return JSON.stringify(array);
  }
}

const someMap = new ArrayKeyedMap();

someMap.set(["Jack", "Mathematics"], "Fee=₹120000");
someMap.set(["Alyne", "Science"], "Fee=₹90000");

console.log(someMap.get(["Jack", "Mathematics"]));

如果需要,您可以更进一步并覆盖其他Map函数keys(),例如entries()使用自定义#fromKey()函数将字符串映射回数组。

于 2021-09-17T07:02:53.123 回答