Itération sur la carte typographique

J’essaie d’itérer sur une carte typescripte mais je continue à avoir des erreurs et je n’ai pas encore trouvé de solution à un problème aussi sortingvial.

Mon code est:

myMap : Map; for(let key of myMap.keys()) { console.log(key); } 

Et j’obtiens l’erreur:

Type ‘IterableIteratorShim ‘ n’est pas un type de tableau ou un type de chaîne.

Trace de stack complète:

Erreur: Typescript a détecté les erreurs suivantes: /home/project/tmp/broccoli_type_script_comstackr-input_base_path-q4GtzHgb.tmp/0/src/app/project/project-data.service.ts (21, 20): Type ‘IterableIteratorShim ‘n’est pas un type tableau ou un type chaîne. at BroccoliTypeScriptComstackr._doIncrementalBuild (/home/project/node_modules/angular-cli/lib/broccoli/broccoli-typescript.js:115:19) sur BroccoliTypeScriptComstackr.build (/ home / project / node_modules / angular-cli / lib / broccoli / broccoli-typescript.js: 43: 10) à /home/project/node_modules/broccoli-caching-writer/index.js:152:21 à la lib $ rsvp $$ interne $$ tryCatch (/ home / project / node_modules / rsvp /dist/rsvp.js:1036:16) à la lib $ rsvp $$ interne $$ invokeCallback (/home/project/node_modules/rsvp/dist/rsvp.js:1048:17) à la lib $ rsvp $$ interne $$ publier (/home/project/node_modules/rsvp/dist/rsvp.js:1019:11) à la lib $ rsvp $ asap $$ flush (/home/project/node_modules/rsvp/dist/rsvp.js:1198:9) à _combinedTickCallback (interne / process / next_tick.js: 67: 7) à process._tickCallback (interne / processus / next_tick.js: 98: 9)

J’utilise angular-cli beta5 et typecript 1.8.10 et ma cible est es5. Est-ce que quelqu’un a eu ce problème?

Vous pouvez utiliser Map.prototype.forEach((value, key, map) => void, thisArg?) : void place

Utilisez-le comme ceci:

 myMap.forEach((value: boolean, key: ssortingng) => { console.log(key, value); }); 

Utilisez simplement la méthode Array.from () pour la convertir en un tableau:

 myMap : Map; for(let key of Array.from( myMap.keys()) ) { console.log(key); } 
 for (let entry of Array.from(map.ensortinges())) { let key = entry[0]; let value = entry[1]; } 

Selon les notes de version de TypeScript 2.3 sur «New --downlevelIteration » :

for..of statements , Array Destructuring et Spread dans les expressions Array, Call et New prennent en charge Symbol.iterator dans ES5 / E3 s’ils sont disponibles lors de l’utilisation de --downlevelIteration

Ce n’est pas activé par défaut! Ajoutez "downlevelIteration": true à votre tsconfig.json ou transmettez l’indicateur --downlevelIteration à tsc pour obtenir le support complet de l’iterator.

Avec ceci en place, vous pouvez écrire for (let keyval of myMap) {...} et le type de keyval sera automatiquement déduit.


Pourquoi est-ce désactivé par défaut? Selon le consortingbuteur TypeScript @aluanhaddad ,

Il est facultatif car il a un impact très important sur la taille du code généré, et potentiellement sur les performances, pour toutes les utilisations d’itérables (y compris les tableaux).

Si vous pouvez cibler ES2015 ( "target": "es2015" dans tsconfig.json ou tsc --target ES2015 ) ou une version ultérieure, l’activation de l’ downlevelIteration est une évidence, mais si vous ciblez ES5 / ES3, vous pouvez évaluer la prise en charge de l’iterator n’affecte pas les performances (si c’est le cas, vous pourriez être mieux avec la conversion forEach ou forEach ou une autre solution de contournement).

Utilisation des fonctions Array.from , Array.prototype.forEach () et arrow :

Itérer sur les touches :

 Array.from(myMap.keys()).forEach(key => console.log(key)); 

Itérer sur les valeurs :

 Array.from(myMap.values()).forEach(value => console.log(value)); 

Itérer sur les entrées :

 Array.from(myMap.ensortinges()).forEach(entry => console.log('Key: ' + entry[0] + ' Value: ' + entry[1])); 

J’utilise les derniers TS et nœuds (v2.6 et v8.9 respectivement) et je peux faire:

 let myMap = new Map(); myMap.set("a", true); for (let [k, v] of myMap) { console.log(k + "=" + v); } 

Cela a fonctionné pour moi. Version de TypeScript: 2.8.3

 for (const [key, value] of Object.ensortinges(myMap)) { console.log(key, value); } 

Juste une explication simple pour le faire à partir de HTML si vous avez une carte de types (clé, tableau):

Je initialise le tableau de cette façon:

 public cityShop: Map = new Map(); 

Et pour itérer dessus, je crée un tableau à partir des valeurs clés: – utilisez-le simplement comme un tableau avec: keys = Array.from (this.cityShop.keys ());

Puis, en HTML, je peux utiliser:

 *ngFor="let key of keys" 

À l’intérieur de ce kernel, je viens d’obtenir la valeur du tableau avec this.cityShop.get (clé)

Et fait!

Si vous n’aimez pas vraiment les fonctions nestedes, vous pouvez également parcourir les clés:

 myMap : Map; for(let key of myMap) { if (myMap.hasOwnProperty(key)) { console.log(JSON.ssortingngify({key: key, value: myMap[key]})); } } 

Notez que vous devez filtrer les itérations non-clés avec hasOwnProperty , si vous ne le faites pas, vous obtenez un avertissement ou une erreur.