繁体   English   中英

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

[英]Get or set element in a Javascript ES6 Map?

是否可以在 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)

除非您是 google-scale,否则性能在此级别上应该无关紧要。 但如果这是一个严重的瓶颈,在可预见的未来,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())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM