この解答例はChatGPTによって生成されています,正しいかは自己判断で。 皆の投稿からも解答例が見つかるかもしれませんよ。

BFE.devでのAI解答例 - JavaScript コーディング問題
169. LRU - Chrome storage自動消去

以下は、LRUStorageの実装です。

class LRUStorage {  capacity: number;  data: Map<string, OriginData>;  timestamp: () => number;  constructor(capacity: number, timestamp: () => number = Date.now) {    this.capacity = capacity;    this.data = new Map();    this.timestamp = timestamp;  }  private evict(): void {    let oldestTime = Infinity;    let oldestOrigin = '';    for (const [origin, data] of this.data.entries()) {      if (data.persistent) {        continue;      }      if (data.lastUsed < oldestTime) {        oldestTime = data.lastUsed;        oldestOrigin = origin;      }    }    if (oldestOrigin) {      this.data.delete(oldestOrigin);    }  }  private touchData(origin: string): OriginData | undefined {    const data = this.data.get(origin);    if (!data) {      return data;    }    data.lastUsed = this.timestamp();    return data;  }  getData(origin: string): OriginData | undefined {    return this.touchData(origin);  }  setData(origin: string, size: number): boolean {    this.touchData(origin);    const oldData = this.data.get(origin);    if (oldData) {      this.data.set(origin, {        ...oldData,        size,        lastUsed: this.timestamp()      });      return true;    } else {      if (this.capacity < size) {        return false;      }      while (this.capacity - size < this.totalSize()) {        this.evict();      }      this.data.set(origin, {        origin,        size,        lastUsed: this.timestamp(),        persistent: false      });      return true;    }  }  clearData(origin: string): void {    this.data.delete(origin);  }  makePersistent(origin: string): void {    const data = this.touchData(origin);    if (data) {      data.persistent = true;    }  }  totalSize(): number {    let total = 0;    for (const data of this.data.values()) {      total += data.size;    }    return total;  }}

基本的には、Mapを使用し、データを格納します。そして、データに制限がかかった場合には、LRU (Least Recently Used) アルゴリズムを使用して、オリジンデータのスペースを開けます。

さらに、 getDatasetData の呼び出し時にも、オリジンデータを最新のものにし、 getData では、オリジンデータが存在しない場合 undefined を返すようにしています。

最後に、 makePersistent メソッドでは、データを永続にします。 永続的なデータは、特別にマークされ、LRUアルゴリズムによって削除されることはありません。

あなたのタイムスタンプ関数は、デフォルトで Date.now を使用していますが、コンストラクタの二番目の引数として渡すことができます。この機能を使用することで、テスト中にタイムスタンプを固定することも可能です。