你会怎么做呢?本能地,我想做:
var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);
// wishful, ignorant thinking
var newMap = myMap.map((key, value) => value + 1); // Map { 'thing1' => 2, 'thing2' => 3, 'thing3' => 4 }
我还没有从documentation on the new iteration protocol收集到太多信息。
我知道wu.js,但我正在运行一个Babel项目,不想包含Traceur,它是it seems like it currently depends on。
对于如何将how fitzgen/wu.js did it提取到我自己的项目中,我也有点糊涂。
我想要一个清晰、简洁的解释我在这里遗漏了什么。谢谢!
Docs for ES6 Map,仅供参考
发布于 2015-06-27 10:55:50
所以.map
本身只提供了一个你关心的值...也就是说,有几种方法可以解决这个问题:
// instantiation
const myMap = new Map([
[ "A", 1 ],
[ "B", 2 ]
]);
// what's built into Map for you
myMap.forEach( (val, key) => console.log(key, val) ); // "A 1", "B 2"
// what Array can do for you
Array.from( myMap ).map(([key, value]) => ({ key, value })); // [{key:"A", value: 1}, ... ]
// less awesome iteration
let entries = myMap.entries( );
for (let entry of entries) {
console.log(entry);
}
注意,我在第二个例子中使用了很多新东西……...Array.from
接受任何可迭代的(任何时候使用[].slice.call( )
,加上集合和映射),并将其转换为一个数组...当...Maps被强制转换为数组时,它会转换为数组的数组,其中的el[0] === key && el[1] === value;
(基本上与我在上面预先填充示例映射的格式相同)。
在为每个el返回一个对象之前,我在lambda的参数位置使用了数组的解构,以将这些数组点赋给值。
如果您在生产中使用Babel,您将需要使用Babel的浏览器polyfill (包括"core-js“和Facebook的"regenerator")。
我很确定它包含Array.from
。
发布于 2015-06-27 11:06:20
您应该只使用
var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);
var newArr = [...myMap].map(value => value[1] + 1);
console.log(newArr); //[2, 3, 4]
var newArr2 = [for(value of myMap) value = value[1] + 1];
console.log(newArr2); //[2, 3, 4]
发布于 2015-06-27 11:29:00
只需使用Array.from(iterable, [mapFn])
即可。
var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);
var newEntries = Array.from(myMap, ([key, value]) => [key, value + 1]);
var newMap = new Map(newEntries);
https://stackoverflow.com/questions/31084619
复制相似问题