在 JavaScript 中,Map 是一种内置的数据结构,它可以存储任意类型的键和值,并且保持它们之间的关联。Map 对象是一组键值对的有序列表,其中键的范围不限于字符串,也可以是数字、布尔值、函数等其他类型。
Map 对象提供了以下方法:
- set(key, value):向 Map 对象中添加一个键值对。
- get(key):根据键获取对应的值,如果不存在该键,则返回 undefined。
- has(key):判断 Map 对象中是否存在指定键。
- delete(key):从 Map 对象中删除指定键值对。
- clear():清空 Map 对象中的所有键值对。
- size:获取 Map 对象中键值对的数量。
- keys():获取 Map 对象中所有键组成的可迭代对象。
- values():获取 Map 对象中所有值组成的可迭代对象。
- entries():获取 Map 对象中所有键值对组成的可迭代对象。
const myMap = new Map();
myMap.set("key1", "value1");
myMap.set("key2", "value2");
console.log(myMap.get("key1")); // 输出:value1
console.log(myMap.has("key2")); // 输出:true
myMap.delete("key2");
console.log(myMap.has("key2")); // 输出:false
console.log(myMap.size); // 输出:1
console.log([...myMap.keys()]); // 输出:["key1"]
console.log([...myMap.values()]); // 输出:["value1"]
console.log([...myMap.entries()]); // 输出:[["key1", "value1"]]
myMap.clear();
console.log(myMap.size); // 输出:0
需要注意的是,Map 对象中的键值对是有序的,即它们按照插入顺序排列。
进阶一下:我们也可以自己定义对象模拟这个数据结构来实现基本的功能,具体实现如下:
class MyMap {
constructor() {
this.map = {};
}
set(key, value) {
this.map[key] = value;
}
get(key) {
return this.map[key];
}
has(key) {
return this.map.hasOwnProperty(key);
}
delete(key) {
if (this.has(key)) {
delete this.map[key];
return true;
} else {
return false;
}
}
clear() {
this.map = {};
}
size() {
return Object.keys(this.map).length;
}
keys() {
return Object.keys(this.map);
}
values() {
return Object.values(this.map);
}
entries() {
return Object.entries(this.map);
}
}
在这个实现中,我们使用一个对象来存储键值对。
- set 方法将一个键值对添加到对象中,
- get 方法根据键获取值,
- has 方法判断是否存在某个键,
- delete 方法删除某个键值对,
- clear 方法清空所有键值对,
- size 方法获取键值对数量,
- keys 方法获取所有键,
- values 方法获取所有值,
- entries 方法获取所有键值对。
还需要注意的是:我们在开发中定义map数据结构时: 下面的写法会报错,报错信息如下: const map = new Map({ ^ TypeError: object is not iterable(对象不可迭代) (cannot read property Symbol(Symbol.iterator)) at new Map ()
//错误的写法
const map = new Map({
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
});
//正确的写法
const map = new Map([ ["I", 1],
["V", 5],
["X", 10],
["L", 50],
["C", 100],
["D", 500],
["M", 1000],
]);