我有一个用例,我希望从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。
答案 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()));