212 votes

Itération sur une carte dactylographiée

Je suis en train de parcourir un fichier d'enregistrement de la carte, mais je continue à recevoir des erreurs et je ne pouvais pas trouver un solution pour ce genre de un problème trivial.

Mon code est:

myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
   console.log(key);
}

Et j'obtiens l'Erreur:

Type 'IterableIteratorShim<[string, boolean]>' n'est pas un tableau de type ou d'un type de chaîne.

Full Stack Trace:

Erreur: le Manuscrit trouvé les erreurs suivantes: /home/project/tmp/broccoli_type_script_compiler-input_base_path-q4GtzHgb.tmp/0/src/app/project/project-data.service.ts (21, 20): Type " IterableIteratorShim<[string, boolean]>' n'est pas un tableau de type ou d'un type de chaîne. au BroccoliTypeScriptCompiler._doIncrementalBuild (/home/projet/node_modules/angulaires-cli/lib/brocoli/brocoli-tapuscrit.js:115:19) au BroccoliTypeScriptCompiler.construire (/home/projet/node_modules/angulaires-cli/lib/brocoli/brocoli-tapuscrit.js:43:10) à /home/projet/node_modules/brocoli-en cache-écrivain/index.js:152:21 au lib$rsvp$$internes$$tryCatch (/home/projet/node_modules/rsvp/dist/rsvp.js:1036:16) au lib$rsvp$$internes$$invokeCallback (/home/projet/node_modules/rsvp/dist/rsvp.js:1048:17) au lib$rsvp$$internes$$publier (/home/projet/node_modules/rsvp/dist/rsvp.js:1019:11) au lib$rsvp$asap$$flush (/home/projet/node_modules/rsvp/dist/rsvp.js:1198:9) au _combinedTickCallback (interne/processus/next_tick.js:67:7) au processus._tickCallback (interne/processus/next_tick.js:98:9)

Je suis en utilisant angulaires-cli beta5 et tapuscrit 1.8.10 et mon objectif est es5. Quelqu'un a eu ce Problème?

302voto

rinukkusu Points 14217

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

Utilisez-le comme ceci:

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

103voto

Oded Breiner Points 1852
for (let entry of Array.from(map.entries())) {
    let key = entry[0];
    let value = entry[1];
}

54voto

6qat Points 249

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

 myMap : Map<string, boolean>;
for(let key of Array.from( myMap.keys()) ) {
   console.log(key);
}
 

38voto

Tobold Points 3154

À L'Aide De La Matrice.depuis, Tableau.le prototype.forEach(), et la flèche fonctions:

Itérer sur les touches:

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

Effectuer une itération sur les valeurs:

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

Itérer sur les entrées:

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

23voto

Ahmed Fasih Points 457

Par le Tapuscrit sortie de la version 2.3 notes sur "Nouveau --downlevelIteration":

for..of statements, Tableau de Déstructuration, et la Propagation des éléments dans le Tableau, à l'Appel, et de Nouvelles expressions de soutien Symbole.itérateur dans l'ES5/E3 si disponible lors de l'utilisation d' --downlevelIteration

Ce n'est pas activée par défaut! Ajouter "downlevelIteration": true votre tsconfig.json, ou à passer à l' --downlevelIteration le drapeau en tsc, pour obtenir un itérateur de soutien.

Dans ce lieu, vous pouvez écrire for (let keyval of myMap) {...} et keyvals'type sera automatiquement déduit.


Pourquoi est-ce désactivée par défaut? Selon Tapuscrit contributeur @aluanhaddad,

C'est une option, car cela a un impact très important sur la taille du code généré, et potentiellement sur la performance, pour tous les usages de iterables (y compris les tableaux).

Si vous pouvez cibler ES2015 ("target": "es2015" en tsconfig.json ou tsc --target ES2015) ou plus tard, l'activation downlevelIteration est une évidence, mais si vous ciblez ES5/ES3, vous risquez de référence pour assurer l'itérateur de soutien n'a pas d'impact sur les performances (si c'est le cas, vous pourriez être mieux avec Array.from de conversion ou d' forEach ou une autre solution de contournement).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X