Maison > Questions et réponses > le corps du texte
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粉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
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.