Javascript 为什么可以';我是否迭代ES6映射的属性?
在Node.js REPL中:Javascript 为什么可以';我是否迭代ES6映射的属性?,javascript,node.js,dictionary,ecmascript-6,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 正如您所看到的,foo和bar键在map中有明确的定义,但是当我尝试使用map.prototype.forE
> 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
对它们进行迭代时,什么都没有发生-但是。还要注意,Map.prototype.forEach
是定义的,所以这不仅仅是因为这个方法还没有实现。我也试着用来。。。对于…
loop,结果是一样的——我提供给每个迭代运行的代码实际上并没有运行,尽管如此
我在Node.jsv4.4.4上。我在网上搜索了“javascript映射不是可移植节点”之类的东西,但运气不好
这是怎么回事?不是100%阳性,但我认为您需要使用
map。使用map设置
var map = new Map();
map.set('foo', 'bar');
map.set('bar', 'baz');
map.forEach(console.log);
这将注销您正在查找的每个项目。由于Map.prototype.forEach
正在查找可移植属性,因此需要使用set()
函数来设置这些可移植属性。不是100%正,但我认为需要使用Map.set
和Map
var map = new Map();
map.set('foo', 'bar');
map.set('bar', 'baz');
map.forEach(console.log);
这将注销您正在查找的每个项目。由于Map.prototype.forEach
正在查找可移植属性,因此需要使用set()
函数来设置这些可移植属性。Map
是一种抽象数据类型。使用new
应用Map
构造函数当然会创建一个普通对象。但是Map
本身被抽象在它的API后面(Map.prototype.get/set/has/clear
等):
const map=newmap([[“key1”,1],“key2”,2]]);
//可以修改贴图对象:
映射[“foo”]=“bar”;
map.bar=“baz”;
控制台日志(map);
//但您需要使用Map API来改变地图本身:
地图集(“键3”,3);
map.forEach(console.log.bind(console))
Map
是一种抽象数据类型。使用new
应用Map
构造函数当然会创建一个普通对象。但是Map
本身被抽象在它的API后面(Map.prototype.get/set/has/clear
等):
const map=newmap([[“key1”,1],“key2”,2]]);
//可以修改贴图对象:
映射[“foo”]=“bar”;
map.bar=“baz”;
控制台日志(map);
//但您需要使用Map API来改变地图本身:
地图集(“键3”,3);
map.forEach(console.log.bind(console))代码>我们可以使用for(){…}操作符来迭代ES6映射
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}
{'_a' => 2, '_b' => 4, '_c' => 6}
我们可以使用for(){…}操作符来迭代ES6映射
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}
{'_a' => 2, '_b' => 4, '_c' => 6}
如果我们想使用.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}
{'_a' => 2, '_b' => 4, '_c' => 6}
如果我们想使用.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}
{'_a' => 2, '_b' => 4, '_c' => 6}
到底是什么?这是有效的(只要我被允许,我会尽快接受你的答案),但我无法想象为什么会这样——或者,就这一点而言,为什么map[key]
语法看起来“有效”,但实际上并非如此,以如此令人困惑的方式。无论如何,谢谢!哦,我明白了。这是因为我在地图上设置了一个属性,而Map.set
在地图内设置了一个键。。。如果这有意义的话。因为地图是一个对象
,所以你可以在地图上打上你想要的任何属性。就像您可以说[].foo=“bar”
一样,要将冲压属性隐藏到数组中,您也可以对映射或函数执行相同的操作。因此,当您尝试这样做时,它不会出错。但是,映射使用ES6中的迭代器
功能,这意味着您需要使用.set()
来设置值,而不是使用点符号或括号符号来设置值。这就是地图的工作原理。到底是什么?这是有效的(只要我被允许,我会尽快接受你的答案),但我无法想象为什么会这样——或者,就这一点而言,为什么map[key]
语法看起来“有效”,但实际上并非如此,以如此令人困惑的方式。无论如何,谢谢!哦,我明白了。这是因为我在地图上设置了一个属性,而Map.set
在地图内设置了一个键。。。如果这有意义的话。因为地图是一个对象
,所以你可以在地图上打上你想要的任何属性。就像您可以说[].foo=“bar”
一样,要将冲压属性隐藏到数组中,您也可以对映射或函数执行相同的操作。因此,当您尝试这样做时,它不会出错。但是,映射使用ES6中的迭代器
功能,这意味着您需要使用.set()
来设置值,而不是使用点符号或括号符号来设置值。这就是贴图的工作方式。Map
对象没有属性,它们有条目。使用newmap([['foo','bar',['bar','baz']])创建它。
Map
对象没有属性,它们有条目。使用newmap([['foo',bar',['bar',baz']])创建它。