在 TypeScript 中,Map 是一种新的数据结构,用于存储键值对(key-value pairs)。与传统的对象不同,Map 对象的键可以是任何类型,包括对象、函数等,而不仅仅是字符串或符号。Map 提供了更丰富的功能和更高效的操作,适用于需要进行频繁查找、插入和删除的场景。


目录

  1. 基本语法
  2. 创建 Map 对象
  3. Map 对象方法
  4. Map 对象的迭代
  5. Map 与其他数据结构的对比
  6. Map 类型推断
  7. 参考资料

1. 基本语法

Map 是 ES6 引入的原生对象,它允许存储键值对,其中键和值的类型可以是任意数据类型。

示例:

let map: Map<string, number> = new Map();
map.set("Alice", 25);
map.set("Bob", 30);
map.set("Charlie", 35);

console.log(map);  // 输出: Map { 'Alice' => 25, 'Bob' => 30, 'Charlie' => 35 }

在这个示例中,我们创建了一个 Map,它的键是 string 类型,值是 number 类型。


2. 创建 Map 对象

创建 Map 对象有两种常见方式:

  1. 使用构造函数 new Map() 创建空的 Map 对象。
  2. 使用键值对数组初始化 Map 对象。

示例:

空的 Map 对象:

let map1: Map<string, number> = new Map();
map1.set("John", 28);
map1.set("Jane", 22);

使用数组初始化 Map 对象:

let map2: Map<string, number> = new Map([
    ["Apple", 1],
    ["Banana", 2],
    ["Orange", 3]
]);

console.log(map2);  // 输出: Map { 'Apple' => 1, 'Banana' => 2, 'Orange' => 3 }


3. Map 对象方法

Map 提供了一些常用的方法来操作键值对,包括添加、删除、查询等操作。

方法说明
set(key, value)添加或更新键值对
get(key)获取指定键的值
has(key)判断 Map 中是否存在指定键
delete(key)删除指定键及其值
clear()清空 Map 中的所有键值对
size获取 Map 中键值对的数量

示例:

let map: Map<string, number> = new Map();

// set() - 添加键值对
map.set("Alice", 25);
map.set("Bob", 30);

// get() - 获取值
console.log(map.get("Alice"));  // 输出: 25

// has() - 判断键是否存在
console.log(map.has("Bob"));    // 输出: true
console.log(map.has("Charlie"));  // 输出: false

// delete() - 删除指定键值对
map.delete("Bob");
console.log(map);  // 输出: Map { 'Alice' => 25 }

// clear() - 清空 Map
map.clear();
console.log(map);  // 输出: Map {}


4. Map 对象的迭代

Map 对象是可迭代的,支持通过 forEach() 方法和 for...of 循环进行遍历。Map 的迭代顺序是按照插入顺序进行的。

示例:

使用 forEach() 方法遍历:

let map: Map<string, number> = new Map([
    ["Apple", 1],
    ["Banana", 2],
    ["Orange", 3]
]);

map.forEach((value, key) => {
    console.log(`${key}: ${value}`);
});

输出:

Apple: 1
Banana: 2
Orange: 3

使用 for...of 循环遍历:

for (let [key, value] of map) {
    console.log(`${key}: ${value}`);
}

输出:

Apple: 1
Banana: 2
Orange: 3

使用 keys(), values()entries() 迭代:

  • keys() 返回一个可迭代的键集合
  • values() 返回一个可迭代的值集合
  • entries() 返回一个包含键值对的可迭代对象
// 使用 keys() 遍历键
for (let key of map.keys()) {
    console.log(key);
}

// 使用 values() 遍历值
for (let value of map.values()) {
    console.log(value);
}

// 使用 entries() 遍历键值对
for (let [key, value] of map.entries()) {
    console.log(`${key}: ${value}`);
}


5. Map 与其他数据结构的对比

与对象的对比

  • 键的类型: 对象的键只能是字符串或符号,而 Map 的键可以是任何类型(包括对象、函数等)。
  • 顺序: Map 保持键值对的插入顺序,而对象的键顺序并不保证。
  • 性能: 在频繁增删查找键值对时,Map 的性能通常优于对象。

与数组的对比

  • 数组: 数组是基于索引的,适用于存储有序的数据。而 Map 是基于键值对的,适用于需要关联每个值的情况。
  • 遍历: Map 支持直接按插入顺序迭代,而数组按索引顺序迭代。

6. Map 类型推断

TypeScript 会根据 Map 初始化时的键和值类型推断出 Map 对象的类型。如果不提供类型注解,TypeScript 会自动推断。

示例:

let map = new Map([["Alice", 25], ["Bob", 30]]);
// TypeScript 推断 map 为 Map<string, number>

如果明确指定类型,TypeScript 会进行类型检查,确保键和值符合预期的类型。

示例:

let map: Map<string, number> = new Map();
map.set("John", 28);  // 正确
map.set(123, 25);     // 错误:类型 'number' 的参数不能赋给类型 'string' 的参数


7. 参考资料

📌 出站链接:

🔗 站内链接:


Map 对象是一个非常强大的数据结构,适合需要键值对存储且键类型不固定的场景。通过 Map,我们可以更方便地进行增、删、查操作,并且它的插入顺序和键类型灵活性使其在处理某些复杂数据时比对象更加高效和易于使用。