【问题标题】:Get or set element in a Javascript ES6 Map?在 Javascript ES6 Map 中获取或设置元素?
【发布时间】:2016-05-10 09:47:34
【问题描述】:

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

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

【问题讨论】:

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

标签: javascript dictionary find add


【解决方案1】:

无论如何都必须进行查找,避免它并不重要,至少在引擎得到更多优化之前。

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

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

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

【讨论】:

    【解决方案2】:

    我个人最终将我的地图更改为一个简单的对象。这允许像这样编写一个reduce(将条目分组到集合中):

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

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      相关资源
      最近更新 更多