javascript - 如何遍历 Typescript 中的地图:for...in?为了……的?为每个?
问题描述
我试图了解在 Typescript 中迭代地图的语法。我的地图中的键是字符串。这些值是字符串数组。
这是一些示例代码:
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");
当我运行这段代码时,唯一打印的是“完成”。
为什么地图中没有任何内容被打印出来,“我们在地图中”的消息也没有?就好像永远不会进入 for 循环一样。为什么会这样,我将如何解决这个问题?
解决方案
当您将键设置为 Map 时,键不会被放入 Map 实例中 - 它们存储在 Map内部,并且只能通过使用各种 Map 迭代方法之一来访问。仅直接在对象或其原型上for..in
迭代属性。
要遍历 Map,请尝试以下操作:
for (const [key, value] of attributeMap.entries()) {
console.log(key, value);
}
for..in
当您的集合是一个在对象本身上具有键值对的普通对象时才有意义,但不适用于以不同方式存储数据的 Maps。
当属性直接位于对象上时,语法通常如下所示:
someObj.someProp = 'someVal';
这会将someProp
属性放到someObj
对象上。
但是地图将其数据存储在地图的 [[MapData]]内部槽中,而不是直接存储在地图的不同属性上。
就像一个理论练习一样,在 JS 中,您可以将属性直接放在 Map 实例上,然后它会被迭代for..in
(基本上,滥用地图作为具有自身属性的对象):
const map = new Map();
map.foo = 'bar';
for (const prop in map) {
// ...
}
但这是一种反模式,永远不应该这样做。要么使用对象并使用点和括号表示法(以及其他对象方法,如Object.entries
)来设置/检索属性,或者使用 Map 并使用Map.get
andMap.set
和其他 Map 方法设置/检索属性。
推荐阅读
- r - 按组 dplyr 改变重复值
- android - 相对于不规则的图像视图形状放置按钮
- java - 如何使用缓冲写入器在文件中逐行写入?
- android - UI 未使用 SQLite 数据库中保存的项目填充 ListView
- python - 类型错误:&:“str”和“str”不支持的操作数类型
- java - 出现 OutOfMemoryError:Java 中的 Java 堆空间
- java - 不需要的下采样:Java Sound
- javascript - 如何更改应用于多个元素中的跨度的类?
- r - opencpu 云的安全配置文件是什么?
- javascript - ESLint 在括号中显示错误