¿TypeScript para... de con índice/clave?
Como se describe aquí, TypeScript introduce un bucle foreach:
var someArray = [9, 2, 5];
for (var item of someArray) {
console.log(item); // 9,2,5
}
¿Pero no hay ningún índice/clave? Esperaría algo como:
for (var item, key of someArray) { ... }
.forEach
ya tiene esta habilidad:
const someArray = [9, 2, 5];
someArray.forEach((value, index) => {
console.log(index); // 0, 1, 2
console.log(value); // 9, 2, 5
});
Pero si desea las capacidades de for...of
, puede map
crear la matriz con el índice y el valor:
for (const { index, value } of someArray.map((value, index) => ({ index, value }))) {
console.log(index); // 0, 1, 2
console.log(value); // 9, 2, 5
}
Es un poco largo, por lo que puede resultar útil ponerlo en una función reutilizable:
function toEntries<T>(a: T[]) {
return a.map((value, index) => [index, value] as const);
}
for (const [index, value] of toEntries(someArray)) {
// ..etc..
}
Versión iterable
Esto funcionará cuando se apunte a ES3 o ES5 si compila con la --downlevelIteration
opción del compilador.
function* toEntries<T>(values: T[] | IterableIterator<T>) {
let index = 0;
for (const value of values) {
yield [index, value] as const;
index++;
}
}
Array.prototype.entries() - ES6+
Si puede apuntar a entornos ES6+, puede utilizar el .entries()
método como se describe en la respuesta de Arnavion .
Ver: Array.prototype.entries()
for (const [key, item] of someArray.entries()) { ... }
En TS, esto requiere apuntar a ES2015, ya que requiere que el tiempo de ejecución admita iteradores , algo que los tiempos de ejecución de ES5 no hacen. Por supuesto, puede usar algo como Babel para que la salida funcione en tiempos de ejecución de ES5.
"Javascript de la vieja escuela" al rescate (para aquellos que no están familiarizados/enamorados de la programación funcional)
for (let i = 0; i < someArray.length ; i++) {
let item = someArray[i];
}