为什么我无法迭代 ES6 Map 的属性?

问题描述 投票:0回答:5

在 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”之类的内容,但没有成功。

这是怎么回事?

javascript node.js dictionary ecmascript-6
5个回答
7
投票

不是 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
投票

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 类型的好处:它将数据与程序级别分开。


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}

0
投票

如果我们想使用 .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}

0
投票

对于任何尝试将响应式 Map<> 属性(在 Vue.js 中)转换为数组的人,请使用 Array.from()。反应式属性不会“按原样”映射:

const array = Array.from(reactiveMap.entries()).map(([key, value]) => ({ key, value }));

© www.soinside.com 2019 - 2024. All rights reserved.