获取或设置 Javascript ES6 地图中的元素?
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() or 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 规模,否则在此级别上性能应该无关紧要。但如果这是一个严重的瓶颈,在可预见的未来,数组应该仍然比 Map/Set 更快。
我个人最终将我的地图更改为一个简单的对象。这允许像这样编写一个 reduce(将条目分组到一个 Map of Sets 中):
.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())
是否可以在 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() or 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 规模,否则在此级别上性能应该无关紧要。但如果这是一个严重的瓶颈,在可预见的未来,数组应该仍然比 Map/Set 更快。
我个人最终将我的地图更改为一个简单的对象。这允许像这样编写一个 reduce(将条目分组到一个 Map of Sets 中):
.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())