.map() a Javascript ES6 Map?

2022-08-30 04:04:51

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

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,这似乎目前依赖于 Traceur

我也有点不知道如何提取fitzgen/wu.js把它做成我自己的项目。

希望对我在这里缺少的东西进行清晰,简洁的解释。谢谢!


ES6地图文档,仅供参考


答案 1

因此,它本身只提供您关心的一个价值...也就是说,有几种方法可以解决这个问题:.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);
}

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

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

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


答案 2

只需使用.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);