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,用 ?? 兜底即可。

笔记加载中…