Maison  >  Questions et réponses  >  le corps du texte

Étendre les clés() et d'autres méthodes génératrices de la classe Map en javascript

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粉613735289P粉613735289258 Il y a quelques jours433

répondre à tous(2)je répondrai

  • P粉211273535

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

    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

    répondre
    0
  • P粉311089279

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

    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.

    répondre
    0
  • Annulerrépondre