在Javascript ES6 Map中获取或设置元素

Get or set element in a Javascript ES6 Map?

本文关键字:设置 元素 获取 Javascript ES6 Map      更新时间:2023-09-26

是否可以在Javascript Map中一步找到或添加元素?

我想在一个步骤中完成以下操作(以避免两次寻找钥匙的正确位置):

// get the value if the key exists, set a default value otherwise
let aValue = aMap.get(aKey)
if(aValue == null) {
    aMap.set(aKey, aDefaultValue)
}

相反,我只想搜索一次密钥。

在c++中,可以使用std::map::insert()或std::map::lower_bound()

在javascript中,代码可能如下所示:

let iterator = aMap.getPosition(aKey)
let aValue = aMap.getValue(iterator)
if(aValue == null)
{
    aMap.setWithHint(aKey, aValue, iterator)
}

let aValue = aMap.getOrSet(aKey, aDefaultValue) 

我想这是不可能的,但我想确保我是正确的。此外,我很想知道为什么这是一个重要的功能,却不可能。

无论如何都必须进行查找,如果你避免它也没什么关系,至少在引擎得到更多优化之前是这样。

Map.has是一个更好的解决方案,应该比Map.get()快一点。例如:

myMap.has(myKey) ? true : myMap.set(myKey, myValue)

在这个级别上,性能应该是无关紧要的,除非你是谷歌级别的。但是,如果这是一个严重的瓶颈,在可预见的未来,Array仍然应该比Map/Set更快。

我个人最终将Map更改为一个简单的Object。这允许写一个reduce(将条目分组到集合映射中),如下所示:

.reduce((a, [k, v]) => (a[k] = a[k] || new Set()).add(v) ? a : a, {})

有了Map,它应该变成

.reduce((a, [k, v]) => (a.has(k) ? a : a.set(k, new Set())).get(k).add(v) ? a : a, new Map())

对于这个目的来说,这感觉有点太麻烦了。

我同意,如果得到支持,这样的东西将是理想的:

.reduce((a, [k, v]) => a.getOrSet(k, new Set()).add(v) ? a : a, new Map())