Étendre les clés() et d'autres méthodes génératrices de la classe Map en javascript
P粉613735289
P粉613735289 2024-02-04 00:24:18
0
2
441

J'avais besoin d'utiliser un objet comme clé pour ma carte, j'ai donc étendu la classe map qui stringifie l'objet transmis comme indiqué ci-dessous

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)
    }
}

D'après ce que j'ai compris, les clés(), les valeurs() et les entrées() sont des méthodes génératrices qui me permettent de faire quelque chose de similaire

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

Mais cela m'amène à charger toutes les clés que je souhaite éviter, existe-t-il une meilleure façon ?

Modifier : Bien que Map ait des objets comme clés, il vérifie uniquement les objets par référence. Donnez un exemple

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

J'en ai besoin d'un deuxième console.log Retour au 123

P粉613735289
P粉613735289

répondre à tous(2)
P粉211273535

Juste au cas où quelqu'un trébucherait ici à l'avenir, il existe une Proposition de phase 3 qui, si elle est approuvée, ajoutera du sucre syntaxique aux itérateurs afin que vous puissiez faire des choses comme :

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

Essayez ceci (cela ne fonctionne pas encore) :

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

Pas besoin de collecter toutes les valeurs parents dans un tableau, mais parcourez-les directement :

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

De cette façon, la paresse de l'itérateur est préservée : l'instruction next() 时,它都会在 parentKeyIterator 上调用 next() 一次,然后到达 yield est appelée à chaque fois sur l'itérateur étendu, puis mise en pause.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!