2016-03-19 15 views
50

Come descritto here dattiloscritto introduce un ciclo foreach:TypeScript per ... di con indice/chiave?

var someArray = [9, 2, 5]; 
for (var item of someArray) { 
    console.log(item); // 9,2,5 
} 

Ma non c'è alcun/chiave di indice? Mi sarei aspettato qualcosa di simile:

for (var item, key of someArray) { ... } 

risposta

93

.forEach ha già questa capacità:

var someArray = [9, 2, 5]; 
someArray.forEach((item, index) => { 
    console.log(item); // 9, 2, 5 
    console.log(index); // 0, 1, 2 
}); 

Ma se si vuole le capacità di for...of, allora si può map la matrice alla voce e index:

for (const {item, index} of someArray.map((item, index) => ({ item, index }))) { 
    console.log(item); // 9, 2, 5 
    console.log(index); // 0, 1, 2 
} 

Questo è un po 'lungo, quindi aiuta a lanciarlo in una funzione riutilizzabile:

function toItemIndexes<T>(a: T[]) { 
    return a.map((item, index) => ({ item, index })); 
} 

for (const {item, index} of toItemIndexes(someArray)) { 
    // ..etc.. 
} 

Iterable Versione

Questo funziona quando si mira ES3 o ES5 se si compila con l'opzione --downlevelIteration compilatore.

function* toItemIndexes<T>(items: T[] | IterableIterator<T>) { 
    let index = 0; 
    for (const item of items) { 
     yield { item, index }; 
     index++; 
    } 
} 
+0

Ma dattiloscritto compila "per ... di" ad un semplice "per" che ha un indice di _I var. Quindi sarebbe facile per gli sviluppatori di TypeScript permetterci di usare questo _i. Vedi l'esempio del campo da gioco: bit.ly/1R9SfBR – Mick

+2

@Mick dipende dall'obiettivo. Quando si esegue il transpiling su ES6, non lo fa. Il motivo per questo codice in più durante il transpiling è solo quello di far funzionare il codice ES6 nelle versioni precedenti. –

+2

Come puoi fare una pausa? in quel per tutti? –

5

"scuola javascript vecchio" al salvataggio (per coloro che non hanno familiarità/innamorato della programmazione funzionale)

for (let i = 0; i < someArray.length ; i++) { 
    let item = someArray[i]; 
} 
4

È possibile utilizzare il for..in operatore dattiloscritto per accedere all'indice quando si tratta di collezioni.

var test = [7,8,9]; 
for (var i in test) { 
    console.log(i + ': ' + test[i]); 
} 

uscita:

0: 7 
1: 8 
2: 9 

Vedi Demo