我试图理解在Typescript中迭代映射的语法。map中的键是字符串。值是字符串数组。
下面是一些示例代码:let attributeMap: Map<string, string[]> = new Map<string, string[]>();
// sample data
let sampleKey1 = "bob";
// populate map
let value: string[] = attributeMap.get(sampleKey1) || [];
value.push("clever");
attributeMap.set(sampleKey1, value);
value = attributeMap.get(sampleKey1) || [];
value.push("funny");
attributeMap.set(sampleKey1, value);
// try looping through the map
for (let key in attributeMap) {
console.log(attributeMap.get(key));
console.log("WE'RE IN THE MAP!");
}
console.log("done");
当我运行这段代码时,唯一打印出来的是"done"
为什么地图上没有任何东西被打印出来,"我们在地图上"这条信息也没有被打印出来?就好像从来没有进入for循环一样。为什么会这样,我该如何解决?
当您将键设置为Maps时,键不会被放到Map实例中—它们存储在Map的内部中,并且只能通过使用各种Map迭代方法中的一种来访问。for..in
只在对象或其原型上直接迭代属性。
要遍历Map,请尝试这样做:
for (const [key, value] of attributeMap.entries()) {
console.log(key, value);
}
for..in
是有意义的,当你的集合是一个普通对象在对象本身上有键值对,但不适合map,它存储数据的方式不同。
当属性直接在对象上时,语法通常是这样的:
someObj.someProp = 'someVal';
将someProp
属性放到someObj
对象上。
但是Map将它们的数据存储在Map的[[MapData]]内部插槽中,而不是直接存储在Map的不同属性中。
作为一个理论练习,在JS中,可以直接在Map实例上放置一个属性,它将被for..in
迭代(基本上,将Map滥用为具有own-properties的对象):
const map = new Map();
map.foo = 'bar';
for (const prop in map) {
// ...
}
但是这是一个反模式,不应该这样做。要么使用对象和点和括号符号设置/检索属性(以及其他对象方法,如Object.entries
),要么使用Map和Map.get
和Map.set
以及其他Map方法设置/检索属性。