如何获取或设置JavaScript Map而不重复自己

时间:2017-06-24 06:56:43

标签: javascript

我有一个用例,我希望从Map获取一个项目。如果该项不存在,我想插入一个初始值并保存以供日后使用。我也想使用const变量,这样我就不会意外地重新绑定本地变量。我知道我可以编写自己的帮助器,但在我看来,这种模式需要大量的编写,我希望这种模式很常见:

const item = myMap.has(key) ? myMap.get(key) : myMap.set(key, initialize()).get(key);

或在.get()

之后立即避开.set()
const item = myMap.has(key) ? myMap.get(key) : (() => {const value = initialize(); myMap.set(key, value); return value})();

是否有更简单的方法可以将Map中的项目转换为const变量,如果尚不存在,请先插入密钥的初始值?

我知道similar question exists,但在该问题中,插入的项目不需要在插入后存储在本地,而是使用let而不是const

编辑:我已经使用效用函数路径并创建了maputil

1 个答案:

答案 0 :(得分:2)

我们可以稍微减少它 ,将.get(key)部分分解出来:

const item = (myMap.has(key) ? myMap : myMap.set(key, initialize())).get(key);

......但我认为如果不引入新功能,我们就无法继续下去。

const initialize = _ => 42;
const myMap = new Map();
const key = "answer";
const item = (myMap.has(key) ? myMap : myMap.set(key, initialize())).get(key);
console.log(item);
console.log(Array.from(myMap.keys()));

所以是的,可能是效用函数的候选者。 : - )

独立:

const getOrAdd = (map, key, initializer) => {
  if (map.has(key)) {
    return map.get(key);
  }
  const value = initializer();
  map.set(key, value);
  return value;
};
const initialize = _ => 42;
const myMap = new Map();
const key = "answer";
const item = getOrAdd(myMap, key, initialize);
console.log(item);
console.log(Array.from(myMap.keys()));

...或者如果你可以在你的项目中扩展内置(对某些项目而言,对其他项目没有问题):

Object.defineProperty(Map.prototype, "getOrAdd", {
  value: function(key, initializer) {
    if (this.has(key)) {
      return this.get(key);
    }
    const value = initializer();
    this.set(key, value);
    return value;
  }
});
const initialize = _ => 42;
const myMap = new Map();
const key = "answer";
const item = myMap.getOrAdd(key, initialize);
console.log(item);
console.log(Array.from(myMap.keys()));