TypeScript Map 对象
Map 是 ES6 引入的键值对集合,用来替代部分「用普通对象当字典」的场景。与对象相比,Map 的键可以是任意类型,且自带 size、保留插入顺序等特性。
创建与增删改查
用 new Map() 创建,set 存、get 取、delete 删、has 判断是否存在:
let m: Map<string, number> = new Map();
m.set("苹果", 5);
m.set("香蕉", 3);
console.log(m.get("苹果")); // 输出:5
console.log(m.has("香蕉")); // 输出:true
console.log(m.size); // 输出:2
m.delete("苹果");
console.log(m.size); // 输出:1
m.clear();
console.log(m.size); // 输出:0
键可以是任意类型
Map 的键可以是对象等复杂类型,而普通对象的键只能是字符串或 Symbol:
let objKey = { id: 1 };
let map: Map<object, string> = new Map();
map.set(objKey, "第一个对象");
console.log(map.get(objKey)); // 输出:第一个对象
console.log(map.has({ id: 1 })); // 输出:false,不是同一个对象引用
遍历 Map
for...of 默认遍历 entries(键值对),keys / values 分别取键或值:
let m = new Map<string, number>([
["语文", 90],
["数学", 85],
]);
for (let [k, v] of m) {
console.log(k, v); // 输出:语文 90 / 数学 85
}
console.log([...m.keys()]); // 输出:[ '语文', '数学' ]
m.forEach((v, k) => console.log(`${k}=${v}`)); // 输出:语文=90 / 数学=85
Map 与对象的比较
| 对比项 | Map | 普通对象 |
|---|---|---|
| 键类型 | 任意类型 | 字符串或 Symbol |
| size 长度 | 自带 size 属性 | 需 Object.keys().length |
| 遍历顺序 | 按插入顺序 | 不保证 |
| 适用场景 | 键频繁增删 | 结构化的固定字段 |
当键不确定、需要频繁增删或键为对象时,优先考虑 Map。
用 Map 统计词频
一个经典场景:统计数组中各元素出现的次数:
let words: string[] = ["a", "b", "a", "c", "a"];
let count = new Map<string, number>();
for (let w of words) {
count.set(w, (count.get(w) ?? 0) + 1);
}
console.log(count.get("a")); // 输出:3
console.log(count.get("b")); // 输出:1
小结
Map 用「任意键 + 有序 + 自带 size」弥补了普通对象当字典时的短板。TypeScript 中记得给 Map 标注泛型 Map<K, V>,取值可能得到 undefined,用 ?? 兜底即可。