为什么Map没有map方法?

5
为了“映射”Map对象,您首先需要将其解构为数组的数组。这对我来说似乎很反向。
有人可以解释一下背后的设计理念吗?我知道其他语言(如Scala)确实为Maps提供了map方法,所以我试图理解为什么它们在JavaScript中不可用。
这种语法似乎非常复杂和冗长:
let mappedMap = new Map( 
  [...originalMap]
  .map(([k, v]) => [k * 2, '_' + v])
);

这难道不可能是这样吗?

let mappedMap = originalMap.map((k, v) => [k * 2, '_' + v]);

4
你应该在委员会经常出没的场所提出这个问题。大多数外部人士都没有对他们的决策有深入了解。 - Felix Kling
至少应该这样写let mappedMap = new Map(Array.from(originalMap, ([k, v]) => [k * 2, '_' + v]))),以避免额外复制数组。同时也很容易地生成可迭代版本。 我猜答案是“因为它总是可以稍后添加的,并且在一个单独的模块中实现也非常简单”。此外,一个普通的 Iterable.map 会更有用,但它也缺失了。 - loganfsmyth
3
据我所知,问题是要通过迭代器的通用方法来解决,而不是直接在“Map”上解决。如果我没记错的话,当ES6规范完成时,并没有太多时间或共识或任何具体的提议来解决这些问题,因此这一点被忽略了。它们很容易使用polyfill实现,我们期望用户库会加入其中。一旦使用模式出现,就会考虑标准化。这与“Array”迭代方法的过程完全相同。 - Bergi
如果您正在寻找具有此功能的东西,请尝试使用Immutable Map(请参见https://facebook.github.io/immutable-js/docs/#/Map)。 - naomi
谢谢你的建议。我打算更仔细地研究Immutable.js,因为它对我编写的应用程序类型很有意义。 - Thijs Koerselman
1个回答

0

ES6中的Map当前表示为具有键/值系统的可迭代对象。数组map函数返回一个新数组。我不确定是否可能以这种方式返回新版本。我会使用forEach来处理Maps并从中构建新的Maps。如果可以的话,您可以构建具有相同功能的函数,我也强烈建议研究immutable.js


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接