NodeJS 为什么我不能修改ES6 Map的属性?

ugmeyewa  于 12个月前  发布在  Node.js
关注(0)|答案(5)|浏览(153)

在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遍历它们时,什么也没有发生-但是根据MDN,它应该发生。还要注意的是,Map.prototype.forEach * 是定义的 *,所以不仅仅是这个方法还没有实现。我还尝试使用了for ... of ...循环,结果是一样的--我提供给每次迭代运行的代码实际上并没有运行,尽管它应该运行。
我在Node.js v4.4.4上。我在网上搜索“JavaScript map不是可迭代节点”之类的,没有运气。
这是怎么回事?

gmol1639

gmol16391#

不是100%肯定,但我认为你需要使用map.setMaps

var map = new Map();
map.set('foo', 'bar');
map.set('bar', 'baz');
map.forEach(console.log);

字符串
这将注销您正在查找的每个项目。因为Map.prototype.forEach正在查找可迭代属性,所以您需要使用set()函数来设置这些可迭代属性。

fwzugrvs

fwzugrvs2#

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

von4xj4u

von4xj4u3#

我们可以使用for(){...}运算符来执行6 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}

nbnkbykc

nbnkbykc4#

如果我们想使用**.map()迭代器,我们可以对Maps使用一个简单的技巧,因为Maps没有map()这样的操作。Dr. Axel Rauschmayer的方法是: 将map转换为[key,value]对的数组。 Map或过滤数组。* 将结果转换回map。
范例:

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}

j1dl9f46

j1dl9f465#

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

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

字符串

相关问题