2017-08-17 6 views
0

マップの最初の100エントリを削除し、マップを再作成せずに、最も効率的な方法にしたいと考えています。あなたは500アイテムES6 Map Object持っている場合ES6 Mapオブジェクト - 最初の100アイテムを削除する最良の方法

だから:

let map = new Map(... 500 items) 

を現在、私はこのようにそれを行う:

const newCache = new Map(
    Array.from(map).slice(100) 
) 

map.clear() 

map = newCache 

しかし、それは地図を再作成します。

Array.from(map.keys()) 
    .slice(0, 100) 
    .forEach(key => map.delete(key)) 

しかし、それは非効率的になります。

他の方法は、最初の100個のキーの上に実行することです。

+2

どうしたのですか? – Barmar

+0

質問を編集しました:私は同じオブジェクトを維持したいと思います。これが最も効率的な方法であるかどうかも疑問です。 –

+0

[配列からサブアレイを取得するには?](https://stackoverflow.com/questions/7538519/how-to-get-subarray-from-array) – Rajesh

答えて

0

あなたのコメントに基づいて、何らかのLRUキャッシュを構築しています。マップだけの優れたデータ構造を検討することもできます。例えば、

cache = { deque: Array, index: Map, offset: Int } 

あなたがキャッシュに要素を入れたとき、あなたは両端キューに追加し、インデックスのオフセットの位置+を格納します。要素を取得するとき

class Cache... 

    put(obj) { 
     this.deque.push(obj) 
     pos = this.deque.length - 1 
     this.index.set(key(obj), pos + this.offset) 
    } 

、それにそのインデックスをチェックします今

get(obj) { 
    pos = this.index.get(key(obj)) - this.offset 
    if pos >= 0 
     return this.deque[pos] 
    // cache miss.... 

正、キャッシュをクリーンアップしても、ループに関与しません

clear(count) { 
    this.deque.splice(0, count) 
    this.offset += count 
} 

一般的には、何かを再作成したいが、同時に永続的なポインタが必要な場合は、プライベートオブジェクトをパブリックオブジェクトとプライベートメソッドのいくつかのプライベートオブジェクトにラップすることができます。

class Cache 
    this._map = new Map() // feel free to recreate this when needed 


    get(x) { return this._map.get(x) } 
    set(x, y) { return this._map.set(x, y) } 

myCache = new Cache() // this can be saved somewhere else 
+0

はラッピングのために答えを受け入れました。それを自分の構造の中に置き換えるためにマップをラップする何かを持つことをお勧めします。それのために行く。 –

+0

LRUキャッシュは、キャッシュヒット時にインデックスを更新する必要があります。 – 6502

3

マップの最初の100個のキーの配列を取得してから削除します。

var keys = Array.from(map.keys()).slice(0, 100); 
keys.forEach(k => map.delete(k)); 

ループを使用すると、スライスする配列を作成する必要がなくなります。

var i = 0; 
for (var k of map.keys()) { 
    if (i++ > 100) { 
     break; 
    } 
    map.delete(k); 
} 

私はこの2つの方法とこのループを使ってjsperfテストを作成しました。ループは、キーをスライスするよりも5倍高速で最も効率的です。

+0

それは非効率的に見えます。 –

+0

どうして最初に 'Array'を作成するのでしょうか?キーと値を安全にループして削除するためのすべてのメソッドがMapに付属しています。 – lexith

+0

@lexithこれらのイテレータを使用している間は削除しても安全かどうかは確かです。また、イテレータをスライスして、最初の100個だけを取得できますか? – Barmar

関連する問題