¿TypeScript para... de con índice/clave?

Resuelto Mick asked hace 8 años • 5 respuestas

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) { ... }
Mick avatar Mar 20 '16 05:03 Mick
Aceptado

.forEachya 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 mapcrear 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 --downlevelIterationopció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 .

David Sherret avatar Mar 19 '2016 23:03 David Sherret

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.

Arnavion avatar Mar 20 '2016 07:03 Arnavion

"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];
}
Sylvain avatar Aug 03 '2017 15:08 Sylvain