如何在JavaScript中获取或设置Map且不重复自己

3

我有一个使用情况,需要从一个Map中获取一个项目。如果该项目不存在,我想插入一个初始值并保存它以备后用。我还想使用const变量,这样我就不会意外重新绑定本地变量。我知道我可以编写自己的帮助程序,但在我看来,这种模式需要大量的编写,而我期望这种模式非常普遍:

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

或者避免在 .set() 后立即使用 .get()

const item = myMap.has(key) ? myMap.get(key) : (() => {const value = initialize(); myMap.set(key, value); return value})();

有没有一种更简单的方法将一个Map中的项目放入一个const变量中,如果它还不存在,则首先插入一个键的初始值?
我知道有一个类似的问题存在,但在那个问题中,没有要求插入的项目在插入后存储在本地,并且它使用let而不是const
编辑:我已经采用实用程序函数路线,并创建了maputil
1个回答

2
我们可以稍微简化一下,将.get(key)部分因式分解:

我们可以将.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()));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接