1. Map结构实现
//最新加入的和最近被访问的将放入迭代器最后面
let LRUCache = function (capacity) {
this.cache = new Map();
this.capacity = capacity;//缓存容量
};
LRUCache.prototype.get = function (key) {
if (this.cache.has(key)) {
//已存在,则删除旧键值对,新增新键值对,目的是将当前键值对后移,保持新鲜
let temp = this.cache.get(key);
this.cache.delete(key);
this.cache.set(key, temp);
return temp;
}
return undefined;//仓库中没有时的返回值
};
LRUCache.prototype.put = function (key, value) {
if (this.cache.has(key)) {
//已存在,则删除旧键值对
this.cache.delete(key);
} else if (this.cache.size >= this.capacity) {
// 不存在,则判定当前容器是否已满
// 已满则删除最上面的价值的(最不新鲜的)
this.cache.delete(this.cache.keys().next().value);
}
//新增新键值对,保持新鲜
this.cache.set(key, value);
};
- Map结构可以记住当前键值对的插入顺序,用来记录数据的新鲜度
- 不用像数组一样需要遍历,时间复杂度O(1)
- 每次都是删除旧键值对,新增键值对,保证新鲜度
- 若超过容器容量上限,则删除迭代器最上面的键值对(最不新鲜),再新增
2. 使用场景
- 缓存(keep-alive、自定义Promise缓存)