为什么我不能迭代ES6地图的属性?

时间:2016-09-22 06:04:55

标签: javascript node.js dictionary ecmascript-6

在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

正如您所看到的,foobar键在map内明确定义,但当我尝试使用Map.prototype.forEach进行迭代时,没有任何反应 - 但是according to MDN, it should。另请注意Map.prototype.forEach 已定义,因此此方法尚未实施。我也尝试使用for ... of ...循环,但结果相同 - 我为每次迭代运行的代码实际上并没有运行,即使是it should

我在Node.js v4.4.4上。我在网上搜索了#34; javascript地图不是可迭代节点"等等,没有运气。

这里发生了什么?

4 个答案:

答案 0 :(得分:4)

不是100%肯定,但我认为您需要map.setMaps一起使用。

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}