.map()一个Javascript ES6地图?

nee*_*zer 67 javascript ecmascript-6

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

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 }
Run Code Online (Sandbox Code Playgroud)

我没有从新迭代协议文档中收集到太多信息.

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

对于如何提取fitzgen/wu.js如何将其添加到我自己的项目中,我也有点无能为力.

我希望能够清楚,简洁地解释我在这里缺少的东西.谢谢!


ES6地图的文件,仅供参考

Nor*_*ard 56

所以.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);
}
Run Code Online (Sandbox Code Playgroud)

注意,我在第二个例子中使用了很多新东西...... ...... Array.from任何可迭代的(任何时候使用[].slice.call( ),加上集合和地图)并将其变成数组...... ... ,当被强制进入一个数组时,变成一个数组数组,其中el[0] === key && el[1] === value;(基本上,与我预先填充我的示例Map with,上面的格式相同).

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

如果您正在使用Babel,在制作中,您将需要使用Babel的浏览器polyfill(包括"core-js"和Facebook的"再生器").
我很确定它包含Array.from.

  • 看看我的回答,`Array.from`将一个map函数作为一个param,你不需要创建一个临时数组来映射它并丢弃它. (2认同)

Wal*_*anG 26

你应该只使用Spread运算符:

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]
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,`[... myMap] .map(mapFn)`将创建一个临时数组然后丢弃它.`Array.from`将`mapFn`作为第二个参数,只需使用它. (4认同)
  • ...圣洁的废话,为什么我不记得传播适用于所有的迭代... (3认同)
  • @wZVanG为什么不使用Array.from(myMap.values(),val => val + 1);` (2认同)

log*_*yth 17

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

var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);

var newArr = Array.from(myMap.values(), value => value + 1);
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,我希望它更高。我一直使用将 Map 分散到临时数组中的模式,而愉快地没有意识到“Array.from()”将映射函数作为可选的第二个参数。 (2认同)

Yuk*_*élé 7

您可以使用此功能:

\n
function mapMap(map, fn) {\n  return new Map(Array.from(map, ([key, value]) => [key, fn(value, key, map)]))\n}\n
Run Code Online (Sandbox Code Playgroud)\n

例子:

\n
var map1 = new Map([[\'A\', 2], [\'B\', 3], [\'C\', 4]])\nvar map2 = mapMap(map1, v => v * v)\nconsole.log(map1, map2)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
Map { A \xe2\x86\x92 2, B \xe2\x86\x92 3, C \xe2\x86\x92 4 }\nMap { A \xe2\x86\x92 4, B \xe2\x86\x92 9, C \xe2\x86\x92 16 }\n
Run Code Online (Sandbox Code Playgroud)\n


Jer*_*kar 5

在打字稿中,以防有人需要它:

export {}

declare global {
    interface Map<K, V> {
        map<T>(predicate: (key: K, value: V) => T): Map<V, T>
    }
}

Map.prototype.map = function<K, V, T>(predicate: (value: V, key: K) => T): Map<K, T> {
    let map: Map<K, T> = new Map()

    this.forEach((value: V, key: K) => {
        map.set(key, predicate(value, key))
    })
    return map
}
Run Code Online (Sandbox Code Playgroud)