cari

Rumah  >  Soal Jawab  >  teks badan

Extend keys() dan kaedah penjana lain kelas Map dalam javascript

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粉613735289P粉613735289379 hari yang lalu532

membalas semua(2)saya akan balas

  • P粉211273535

    P粉2112735352024-02-04 21:25:11

    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

    balas
    0
  • P粉311089279

    P粉3110892792024-02-04 00:20:53

    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.

    balas
    0
  • Batalbalas