获取或设置Javascript ES6映射中的元素?

获取或设置Javascript ES6映射中的元素?,javascript,dictionary,find,add,Javascript,Dictionary,Find,Add,可以在Javascript中一步找到或添加元素吗 我想一步完成以下操作(避免重复寻找钥匙的正确位置): 相反,我只想搜索一次密钥 在C++中,可以使用或< /P> 在javascript中,代码可能如下所示: let iterator = aMap.getPosition(aKey) let aValue = aMap.getValue(iterator) if(aValue == null) { aMap.setWithHint(aKey, aValue, iterator) } .

可以在Javascript中一步找到或添加元素吗

我想一步完成以下操作(避免重复寻找钥匙的正确位置):

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

在C++中,可以使用或< /P> 在javascript中,代码可能如下所示:

let iterator = aMap.getPosition(aKey)
let aValue = aMap.getValue(iterator)
if(aValue == null)
{
    aMap.setWithHint(aKey, aValue, iterator)
}
.reduce((a, [k, v]) => (a[k] = a[k] || new Set()).add(v) ? a : a, {})


我想这是不可能的,但我想确保我是正确的。我还想知道为什么这是一项重要的功能,但它却不可能实现。

无论如何,查找都必须进行,如果你避免它,那没有多大关系,至少在引擎得到进一步优化之前是如此

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

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


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

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

let iterator = aMap.getPosition(aKey)
let aValue = aMap.getValue(iterator)
if(aValue == null)
{
    aMap.setWithHint(aKey, aValue, iterator)
}
.reduce((a, [k, v]) => (a[k] = a[k] || new Set()).add(v) ? a : a, {})
有了地图,它就应该变成

.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())

我是否正确地理解您关心的是在您的代码示例中必须查找两次
aKey
?是的,这就是问题所在。一般来说,您不必担心JavaScript中的此类微优化。现代JavaScript引擎在处理这些方面做得相当好。而且,据我所知,没有办法通过使用地图来防止这种情况。