在 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
迭代它们时,没有任何反应 - 但根据MDN,它应该。另请注意,Map.prototype.forEach
已定义,因此不仅仅是该方法尚未实现。我还尝试使用 for ... of ...
循环,得到相同的结果 - 我提供的为每次迭代运行的代码实际上并未运行,即使 它应该。
我使用的是 Node.js v4.4.4。我在网上搜索了“javascript map is not iterable node”之类的内容,但没有成功。
这是怎么回事?
不是 100% 积极,但我认为你需要将
map.set
与 Maps
一起使用。
var map = new Map();
map.set('foo', 'bar');
map.set('bar', 'baz');
map.forEach(console.log);
这将注销您正在查找的每个项目。因为
Map.prototype.forEach
正在寻找可迭代属性,所以您需要使用 set()
函数来设置这些可迭代属性。
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 类型的好处:它将数据与程序级别分开。
我们可以使用 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}
如果我们想使用 .map() 迭代器,我们可以对 Map 使用一个简单的技巧,因为 Map 没有像 map() 这样的操作。 博士的方法阿克塞尔·劳施梅尔 是: * 将映射转换为[key,value]对的数组。 * 映射或过滤数组。 * 将结果转换回地图。
示例:
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}
对于任何尝试将响应式 Map<> 属性(在 Vue.js 中)转换为数组的人,请使用 Array.from()。反应式属性不会“按原样”映射:
const array = Array.from(reactiveMap.entries()).map(([key, value]) => ({ key, value }));