TypeScript для ... of с индексом / ключом?
Как рассказали здесь TypeScript вводит цикл foreach:
var someArray = [9, 2, 5];
for (var item of someArray) {
console.log(item); // 9,2,5
}
но разве нет никакого индекса / ключа? Я ожидал бы что-то вроде:
for (var item, key of someArray) { ... }
5 ответов:
.forEach
уже имеет эту способность:var someArray = [9, 2, 5]; someArray.forEach((item, index) => { console.log(item); // 9, 2, 5 console.log(index); // 0, 1, 2 });
но если вы хотите, чтобы способности
for...of
, можноmap
массив для элемента и индекса:for (const {item, index} of someArray.map((item, index) => ({ item, index }))) { console.log(item); // 9, 2, 5 console.log(index); // 0, 1, 2 }
это немного долго, поэтому он помогает бросить его в многоразовую функцию:
function toItemIndexes<T>(a: T[]) { return a.map((item, index) => ({ item, index })); } for (const {item, index} of toItemIndexes(someArray)) { // ..etc.. }
Iterable Version
это будет работать при таргетинге ES3 или ES5, если вы компилируете с
--downlevelIteration
опции компилятора.function* toItemIndexes<T>(items: T[] | IterableIterator<T>) { let index = 0; for (const item of items) { yield { item, index }; index++; } }
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries
for (var [key, item] of someArray.entries()) { ... }
в TS для этого требуется таргетинг ES2015 так как это требует выполнения Для поддержки итераторов, который в ES5 рантаймы не. Конечно, вы можете использовать что-то вроде Бабель чтобы выходные данные работали во время выполнения ES5.
"старая школа javascript" на помощь (для тех, кто не знаком/влюблен в функциональное программирование)
for (let i = 0; i < someArray.length ; i++) { let item = someArray[i]; }
Вы можете использовать for..in оператор TypeScript для доступа к индексу при работе с коллекциями.
var test = [7,8,9]; for (var i in test) { console.log(i + ': ' + test[i]); }
выход:
0: 7 1: 8 2: 9
посмотреть демо