2 jawaban

Jawaban Terbaik

Berdasarkan komentar Anda, Anda sedang membangun semacam cache LRU. Anda mungkin mempertimbangkan struktur data yang lebih baik daripada hanya Peta. Sebagai contoh,

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

Saat Anda meletakkan elemen di cache, Anda menambahkannya ke deque dan menyimpan posisinya + offset di indeks:

class Cache...

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

Saat mendapatkan elemen, periksa indeksnya positif

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

Sekarang, membersihkan cache tidak akan melibatkan loop apa pun

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

Pada catatan umum, jika Anda ingin sesuatu dibuat ulang, tetapi memerlukan penunjuk tetap untuk itu pada saat yang sama, Anda bisa membungkus objek pribadi menjadi objek publik dan proxy (beberapa) metode pribadi:

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 
1
georg 17 Agustus 2017, 11:22

Dapatkan larik dari 100 kunci pertama Peta, lalu hapus.

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

Atau Anda dapat menggunakan loop sehingga Anda tidak perlu membuat array untuk diiris.

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

Saya membuat pengujian jsperf dengan dua metode Anda dan loop ini. Loop adalah bar yang paling efisien, 5 kali lebih cepat daripada mengiris kunci.

9
Barmar 17 Agustus 2017, 09:41