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 75

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

посмотреть демо

или другое решение старой школы:

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