long - typescript partial
Iterando sobre el mapa mecanografiado (10)
es5
for (let entry of Array.from(map.entries())) {
let key = entry[0];
let value = entry[1];
}
es6
let myMap = new Map<string, boolean>();
myMap.set("a", true);
for (let [k, v] of myMap) {
console.log(k + "=" + v);
}
Estoy tratando de iterar sobre un mapa mecanografiado, pero sigo recibiendo errores y todavía no puedo encontrar ninguna solución para un problema tan trivial.
Mi código es:
myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
console.log(key);
}
Y me sale el error:
El tipo ''IterableIteratorShim <[string, boolean]>'' no es un tipo de matriz o un tipo de cadena.
Seguimiento completo de la pila:
Error: Typescript found the following errors:
/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]>'' is not an array type or a string type.
at BroccoliTypeScriptCompiler._doIncrementalBuild (/home/project/node_modules/angular-cli/lib/broccoli/broccoli-typescript.js:115:19)
at BroccoliTypeScriptCompiler.build (/home/project/node_modules/angular-cli/lib/broccoli/broccoli-typescript.js:43:10)
at /home/project/node_modules/broccoli-caching-writer/index.js:152:21
at lib$rsvp$$internal$$tryCatch (/home/project/node_modules/rsvp/dist/rsvp.js:1036:16)
at lib$rsvp$$internal$$invokeCallback (/home/project/node_modules/rsvp/dist/rsvp.js:1048:17)
at lib$rsvp$$internal$$publish (/home/project/node_modules/rsvp/dist/rsvp.js:1019:11)
at lib$rsvp$asap$$flush (/home/project/node_modules/rsvp/dist/rsvp.js:1198:9)
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
Estoy usando angular-cli beta5 y mecanografiado 1.8.10 y mi objetivo es es5. ¿Alguien ha tenido este problema?
De acuerdo con las
notas de la versión de TypeScript 2.3 en "New
--downlevelIteration
"
:
for..of statements
, Destrucción defor..of statements
y elementos de propagación en matrices, llamadas y nuevas expresiones admiten Symbol.iterator en ES5 / E3 si está disponible cuando se usa--downlevelIteration
¡Esto no está habilitado por defecto!
Agregue
"downlevelIteration": true
a su
tsconfig.json
, o pase el indicador
--downlevelIteration
a
tsc
, para obtener soporte completo para el iterador.
Con esto en su lugar, puede escribir
for (let keyval of myMap) {...}
y el tipo de
keyval
automáticamente.
¿Por qué está desactivado por defecto? Según el colaborador de TypeScript @aluanhaddad ,
Es opcional porque tiene un impacto muy significativo en el tamaño del código generado, y potencialmente en el rendimiento, para todos los usos de iterables (incluidas las matrices).
Si puede apuntar a ES2015 (
"target": "es2015"
en
tsconfig.json
o
tsc --target ES2015
) o posterior, habilitar
downlevelIteration
es una obviedad, pero si está apuntando a ES5 / ES3, puede comparar para asegurarse el soporte de iterador no afecta el rendimiento (si lo hace, podría ser mejor con
Array.from
conversion o
forEach
u otra solución).
Esto funcionó para mí. Versión de TypeScript: 2.8.3
for (const [key, value] of Object.entries(myMap)) {
console.log(key, value);
}
Esto funcionó para mí.
public cityShop: Map<string, Shop[]> = new Map();
Estoy usando el último TS y nodo (v2.6 y v8.9 respectivamente) y puedo hacer:
Object.keys(myMap).map( key => {
console.log("key: " + key);
console.log("value: " + myMap[key]);
});
Puede usar
Map.prototype.forEach((value, key, map) => void, thisArg?) : void
lugar
Úselo así:
myMap.forEach((value: boolean, key: string) => {
console.log(key, value);
});
Si realmente no le gustan las funciones anidadas, también puede iterar sobre las teclas:
myMap : Map<string, boolean>; for(let key of myMap) { if (myMap.hasOwnProperty(key)) { console.log(JSON.stringify({key: key, value: myMap[key]})); } }
Tenga en cuenta que debe filtrar las iteraciones no clave con
hasOwnProperty
; si no hace esto, recibirá una advertencia o un error.
Simplemente use el método Array.from () para convertirlo en una matriz:
myMap : Map<string, boolean>;
for(let key of Array.from( myMap.keys()) ) {
console.log(key);
}
Solo una explicación simple para hacerlo desde HTML si tiene un Mapa de tipos (clave, matriz):
Inicializo la matriz de esta manera:
*ngFor="let key of keys"
Y para iterar sobre él, creo una matriz a partir de valores clave: - solo úsela como una matriz con: keys = Array.from (this.cityShop.keys ());
Luego, en HTML, puedo usar:
myMap : Map<string, boolean>;
for(let key of myMap) {
if (myMap.hasOwnProperty(key)) {
console.log(JSON.stringify({key: key, value: myMap[key]}));
}
}
Dentro de este bucle, solo obtengo el valor de la matriz con this.cityShop.get (key)
¡Y hecho!
Usando Array.from , Array.prototype.forEach() y funciones de flecha :
Iterar sobre las teclas :
Array.from(myMap.keys()).forEach(key => console.log(key));
Iterar sobre los valores :
Array.from(myMap.values()).forEach(value => console.log(value));
Iterar sobre las entradas :
Array.from(myMap.entries()).forEach(entry => console.log(''Key: '' + entry[0] + '' Value: '' + entry[1]));