如何在Typescript中迭代map: for..in?对. . ?forEach吗?



我试图理解在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.getMap.set以及其他Map方法设置/检索属性。

最新更新