第一阶段:Set 基础
一、Set 创建方式(set的结构可以看成对象)
TypeScript
const set = new Set();
初始化:
TypeScript
const set = new Set([1, 2, 3, 3, 4]);
console.log(set);
// Set(4) {1,2,3,4}
二、常用方法
| 方法 | 说明 |
|---|---|
| add(value) | 添加 |
| delete(value) | 删除 |
| has(value) | 是否存在 |
| clear() | 清空 |
| size | 长度 |
三、遍历方式
TypeScript
const s = new Set([1,2,3]);
for (const item of s) {
console.log(item);
}
forEach:
TypeScript
s.forEach(item => console.log(item));
六、Set 使用场景
方法1:转数组
TypeScript
[...s].forEach((item,index)=>{
console.log(index,item);
});
方法2:
TypeScript
Array.from(s).forEach((item,index)=>{
console.log(index,item);
});
第二阶段:Map 基础入门
一、Map 创建 (Map的结构可以看成二维数组,即[ [ key,value ] ])
TypeScript
const map = new Map();
二、基本方法
| 方法 | 说明 |
|---|---|
| set(key, value) | 设置 |
| get(key) | 获取 |
| has(key) | 是否存在 |
| delete(key) | 删除 |
| clear() | 清空 |
| size | 长度 |
TypeScript
const map = new Map();
map.set('name', 'Tom');
map.set('age', 20);
console.log(map.get('name')); // Tom
console.log(map.size); // 2
三、key 可为任意类型
TypeScript
const objKey = { id: 1 };
const map = new Map();
map.set(objKey, '对象key');
console.log(map.get(objKey));
对比 Object:
TypeScript
const obj = {};
obj[objKey] = 'test';
console.log(obj);
// key 被转成字符串
四、遍历 Map
for...of
TypeScript
for (const [key, value] of map) {
console.log(key, value);
}
keys()
TypeScript
for (const key of map.keys()) {}
values()
TypeScript
for (const value of map.values()) {}
五、Map 转数组
TypeScript
const arr = [...map];
六、数组转 Map
TypeScript
const map = new Map([
['name', 'Tom'],
['age', 20]
]);
第四阶段:Set 与 Map 深度理解
一、底层复杂度
Set:
- add:
O(1) - delete:
O(1) - has:
O(1)
Array:
- includes:
O(n)
二、引用类型注意点
TypeScript
const s = new Set();
s.add({a:1});
s.add({a:1});
console.log(s.size); // 2
原因:
对象地址不同
三、NaN 特殊性
TypeScript
const s = new Set();
s.add(NaN);
s.add(NaN);
console.log(s.size); // 1
第五阶段:高级实战
一、数组交集
TypeScript
const a = [1,2,3];
const b = [2,3,4];
const intersection = a.filter(item => new Set(b).has(item));
console.log(intersection);
// [2,3]
二、数组并集
TypeScript
const union = [...new Set([...a, ...b])];
三、数组差集
TypeScript
const diff = a.filter(item => !new Set(b).has(item));
四、统计词频(Map)
TypeScript
const words = ['a', 'b', 'a', 'c', 'b'];
const wordMap = new Map();
for (const word of words) {
wordMap.set(word, (wordMap.get(word) || 0) + 1);
}
console.log(wordMap);
五、缓存机制(重要)
TypeScript
const cache = new Map();
function getData(id) {
if (cache.has(id)) {
return cache.get(id);
}
const data = fetchData(id);
cache.set(id, data);
return data;
}
第六阶段:常见坑点
1. JSON 无法直接序列化 Map/Set
TypeScript
JSON.stringify(new Set([1,2]));
// {}
正确方式:
TypeScript
JSON.stringify([...set]);
2. 对象引用问题
TypeScript
set.add({});
set.add({});
结果不同对象