Как описано здесь TypeScript представляет цикл foreach:

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

А индекса / ключа нет? Я ожидал чего-то вроде:

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

Mick

Ответов: 5

Ответы (5)

.forEach уже имеет эту способность:

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

Но если вам нужны возможности для ..., тогда вы можете сопоставить массив с индексом и значением:

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

Это немного длинновато, поэтому можно использовать его в многоразовой функции:

function toEntries(a: T[]) {
    return a.map((value, index) => [index, value] as const);
}

for (const [index, value] of toEntries(someArray)) {
    // ..etc..
}

Итерационная версия

Это будет работать при нацеливании на ES3 или ES5, если вы компилируете с параметром компилятора - downlevelIteration.

function* toEntries(values: T[] | IterableIterator) {
    let index = 0;
    for (const value of values) {
        yield [index, value] as const;
        index++;
    }
}

Array.prototype.entries () - ES6 +

Если вы можете настроить таргетинг на среды ES6 +, вы можете использовать метод .entries (), как описано в ответ Arnavion.

«Старый школьный javascript» на помощь (для тех, кто не знаком / не любит функциональное программирование)

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries

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

В TS для этого требуется нацеливание на ES2015 , так как среда выполнения должна поддерживать итераторы, чего нет в среде выполнения ES5. Конечно, вы можете использовать что-то вроде Babel, чтобы вывод работал во время выполнения ES5.

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

var someArray = [9, 2, 5];
let i = 0;
for (var item of someArray) {
    console.log(item); // 9,2,5
    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

См. Демо

2022 WebDevInsider