.map()一个JavaScript的ES6地图?

你会怎么做? 本能地,我想这样做:

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 } 

我没有从新的迭代协议的文档收集很多。

我知道wu.js ,但是我正在运行一个Babel项目,不想包含Traceur , 它似乎依赖于它 。

对于如何将fitzgen / wu.js做成我自己的项目,我也有点无知。

我会喜欢一个清晰,简洁的解释,我在这里失踪。 谢谢!


文件为ES6地图 ,FYI

所以.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( ) ,加上Sets和Maps)它变成了一个数组… map,当强制到一个数组时,变成一个数组的数组,其中el[0] === key && el[1] === value; (基本上,与上面我填写示例Map相同的格式)。

我在lambda的参数位置使用数组的解构,在为每个el返回一个对象之前,将这些数组的点分配给值。

如果你在使用Babel,在生产中,你将需要使用Babel的浏览器polyfill(包括“core-js”和Facebook的“再生器”)。
我很确定它包含Array.from

你应该只使用Spread operador

 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] 

只要使用Array.from(iterable, [mapFn])

 var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]); var newArr = Array.from(myMap.values(), value => value + 1); 
 const mapMap = (callback, map) => new Map(Array.from(map).map(callback)) var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]); var newMap = mapMap((pair) => [pair[0], pair[1] + 1], myMap); // Map { 'thing1' => 2, 'thing2' => 3, 'thing3' => 4 } 

使用Array.from我写了一个Typescript函数来映射值:

 function mapKeys<T, V, U>(m: Map<T, V>, fn: (this: void, v: V) => U): Map<T, U> { function transformPair([k, v]: [T, V]): [T, U] { return [k, fn(v)] } return new Map(Array.from(m.entries(), transformPair)); } const m = new Map([[1, 2], [3, 4]]); console.log(mapKeys(m, i => i + 1)); // Map { 1 => 3, 3 => 5 } 

如果您不希望事先将整个Map转换为数组,并且/或者解构键值数组,则可以使用这个愚蠢的函数:

 /** * Map over an ES6 Map. * * @param {Map} map * @param {Function} cb Callback. Receives two arguments: key, value. * @returns {Array} */ function mapMap(map, cb) { let out = new Array(map.size); let i = 0; map.forEach((val, key) => { out[i++] = cb(key, val); }); return out; } let map = new Map([ ["a", 1], ["b", 2], ["c", 3] ]); console.log( mapMap(map, (k, v) => `${k}-${v}`).join(', ') ); // a-1, b-2, c-3