Extend keys() dan kaedah penjana lain kelas Map dalam javascript
P粉613735289
P粉613735289 2024-02-04 00:24:18
0
2
440

Saya perlu menggunakan objek sebagai kunci untuk peta saya, jadi saya melanjutkan kelas peta yang merangkaikan objek yang diluluskan seperti yang ditunjukkan di bawah

class CoordMapper extends Map {
    set = (k: ISquareCoordinate, v: Array<ISquareCoordinate>) => {
        const stringifiedKey = JSON.stringify(k)
        return super.set(stringifiedKey,v)
    }

    get = (k: ISquareCoordinate) => {
        const stringifiedKey = JSON.stringify(k)
        return super.get(stringifiedKey)
    }
}

Daripada apa yang saya faham keys(), values() dan entries() ialah kaedah penjana supaya saya boleh melakukan sesuatu yang serupa

* keys() {
   const keysArr = [...super.keys()]
   for (const key of keysArr){
      yield JSON.parse(key)
   }
}

Tetapi ini menyebabkan saya memuatkan semua kunci yang saya ingin elakkan, adakah cara yang lebih baik?

Sunting: Walaupun Peta mempunyai objek sebagai kunci, ia hanya menyemak objek dengan rujukan. Berikan contoh

let newMap = Map()
const obj1 = {'a': 1, 'b' :2}
newMap.set(obj1, 123)
const copyObj1 = {...obj1}
console.log(newMap.get(obj1)) //returns 123
console.log(newMap.get(copyObj1)) //returns undefined

Saya perlukan yang kedua console.log Kembali ke 123

P粉613735289
P粉613735289

membalas semua(2)
P粉211273535

Sekiranya sesiapa tersandung di sini pada masa hadapan, terdapat cadangan Fasa 3 yang, jika diluluskan, akan menambah gula sintaksis kepada iterator supaya anda boleh melakukan perkara seperti:

class CoordMapper extends Map {
  *keys() {
    yield* super.keys().map(key => JSON.parse(key));
  }
}

Cuba ini (ini belum berfungsi lagi):

console.config({ maximize: true });

class CoordMapper extends Map {
  set(k, v) {
    return super.set(JSON.stringify(k), v)
  }
  get(k) {
    return super.get(JSON.stringify(k));
  }
  *keys() {
    console.log(super.keys())
    yield* super.keys().map(JSON.parse);
  }
}

const c = new CoordMapper();

c.set({ foo: 'bar' }, 0);
c.set({ baz: 42 }, 1);
c.set({ qux: { lorem: 'ipsum' } }, [null, undefined]);

for (const key of c.keys()) {
  console.log(key);
}
sssccc
P粉311089279

Tidak perlu mengumpul semua nilai induk ke dalam tatasusunan, sebaliknya lelaran terus ke atasnya:

* keys() {
   const parentKeyIterator = super.keys();
   for (const key of parentKeyIterator){
      yield JSON.parse(key)
   }
}

Dengan cara ini, kemalasan iterator dikekalkan: pernyataan next() 时,它都会在 parentKeyIterator 上调用 next() 一次,然后到达 yield dipanggil setiap kali pada iterator lanjutan, dan kemudian dijeda.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!