在Node.js REPL中:
> var map = new Map();
undefined
> map['foo'] = 'bar';
'bar'
> map['bar'] = 'baz';
'baz'
> map
Map { foo: 'bar', bar: 'baz' }
> map.forEach(console.log);
undefined
正如您所看到的,foo
和bar
键在map
内明确定义,但当我尝试使用Map.prototype.forEach
进行迭代时,没有任何反应 - 但是according to MDN, it should。另请注意Map.prototype.forEach
已定义,因此此方法尚未实施。我也尝试使用for ... of ...
循环,但结果相同 - 我为每次迭代运行的代码实际上并没有运行,即使是it should。
我在Node.js v4.4.4上。我在网上搜索了#34; javascript地图不是可迭代节点"等等,没有运气。
这里发生了什么?
答案 0 :(得分:4)
不是100%肯定,但我认为您需要map.set
与Maps
一起使用。
var map = new Map();
map.set('foo', 'bar');
map.set('bar', 'baz');
map.forEach(console.log);
这将注销您要查找的每个项目。因为Map.prototype.forEach
正在寻找可迭代属性,所以您需要使用set()
函数来设置这些可迭代属性。
答案 1 :(得分:1)
Map
是抽象数据类型。将Map
构造函数与new
一起应用会创建一个普通对象。但Map
本身是在其API(Map.prototype.get/set/has/clear
等)后面抽象的:
const map = new Map([["key1", 1], ["key2", 2]]);
// you can mutate the Map object:
map["foo"] = "bar";
map.bar = "baz";
console.log( map );
// but you need to use the Map API to mutate the Map itself:
map.set("key3", 3);
map.forEach(console.log.bind(console));

请注意,这实际上是新Map类型的好处:它将data from the program level分开。
答案 2 :(得分:0)
我们可以使用 for(){...}运算符来迭代ES6 Map
let map0 = new Map([
["a", 1],
["b", 2],
["c", 3]
]);
let map1 = new Map();
for (let [key, value] of myMap) {
map1.set('_' + k, v * 2);
}
产生
{'_a' => 2, '_b' => 4, '_c' => 6}
答案 3 :(得分:0)
如果我们要使用 .map()迭代器,则可以为Maps使用一个简单的技巧,因为对于Maps,没有像map()这样的操作。 来自Dr. Axel Rauschmayer的方法是: *将地图转换成[键,值]对数组。 *映射或过滤数组。 *将结果转换回地图。
示例:
let map0 = new Map([
["a", 1],
["b", 2],
["c", 3]
]);
const map1 = new Map(
[...map0]
.map(([k, v]) => ['_' + k, v * 2 ])
);
产生
{'_a' => 2, '_b' => 4, '_c' => 6}