2016-03-19 16 views
50

Jak opisano here maszynopis wprowadza pętlę foreach:TypeScript dla ... z indeksem/kluczem?

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

Ale nie jest jakiś indeks/klucz? Spodziewam się coś takiego:

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

Odpowiedz

93

.forEach ma już tę zdolność:

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

Ale jeśli chcesz zdolności for...of, można map tablicę do żądanej pozycji i index:

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

To trochę za długo, więc pomaga rzucić je w funkcję wielokrotnego użytku:

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

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

iterowalny Wersja

Taka opcja kierowania ES3 lub ES5 jeśli skompilować z opcją --downlevelIteration kompilatora.

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

Ale maszynopis kompiluje "dla ... z" na prostą "za", która ma _I Indeks var. Łatwiej więc programistom TypeScript pozwolić nam używać tego _i. Zobacz przykład placu zabaw: bit.ly/1R9SfBR – Mick

+2

@ Wybierz zależność od celu. Podczas transpozycji do ES6 nie robi tego. Powód tego dodatkowego kodu podczas transpozycji jest tylko po to, aby kod ES6 działał w poprzednich wersjach. –

+2

Jak można zrobić przerwę; w tym dlaEe? –

5

„Old school javascript” na ratunek (dla tych, którzy nie są zaznajomieni/zakochana programowania funkcjonalnego)

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

Można użyć for..in operatora maszynopis dostęp do indeksu kiedy zajmujesz się kolekcjami.

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

wyjściowa:

0: 7 
1: 8 
2: 9 

Zobacz Demo