Это не так эффективно, как вы хотите, но оно компенсирует это простотой и удобочитаемостью. И во многих случаях это будет достаточно быстро.
Мне понадобился простой кэш LRU для небольшого количества дорогостоящих операций (1 секунда). Я чувствовал себя лучше, вставляя какой-то небольшой код, вместо того, чтобы вводить что-то внешнее, но так как я не нашел его, я написал его:
Обновление : теперь это намного эффективнее (и пространство, и время), так как я удалил массив, потому что Map сохраняет порядок вставки.
class LRU {
constructor(max=10) {
this.max = max;
this.cache = new Map();
}
get(key) {
let item = this.cache.get(key);
if (item) // refresh key
{
this.cache.delete(key);
this.cache.set(key, item);
}
return item;
}
set(key, val) {
if (this.cache.has(key)) // refresh key
this.cache.delete(key);
else if (this.cache.size == this.max) // evict oldest
this.cache.delete(this._first());
this.cache.set(key, val);
}
_first(){
return this.cache.keys().next().value;
}
}
Использование:
> let cache = new LRU(3)
> [1, 2, 3, 4, 5].forEach(v => cache.set(v, 'v:'+v))
> cache.get(2)
undefined
> cache.get(3)
"v:3"
> cache.set(6, 6)
> cache.get(4)
undefined
> cache.get(3)
"v:3"