Как описано здесь, TypeScript представляет цикл foreach:
var someArray = [9, 2, 5];
for (var item of someArray) {
console.log(item); // 9,2,5
}
Но разве нет индекса / ключа? Я ожидал чего-то вроде:
for (var item, key of someArray) { ... }
Ответы:
.forEach
уже имеет эту способность:
const someArray = [9, 2, 5];
someArray.forEach((value, index) => {
console.log(index); // 0, 1, 2
console.log(value); // 9, 2, 5
});
Но если вам нужны возможности for...of
, вы можете map
использовать массив с индексом и значением:
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<T>(a: T[]) {
return a.map((value, index) => [index, value] as const);
}
for (const [index, value] of toEntries(someArray)) {
// ..etc..
}
Итерационная версия
Это будет работать при нацеливании на ES3 или ES5, если вы компилируете с параметром --downlevelIteration
компилятора.
function* toEntries<T>(values: T[] | IterableIterator<T>) {
let index = 0;
for (const value of values) {
yield [index, value] as const;
index++;
}
}
Array.prototype.entries () - ES6 +
Если вы можете настроить таргетинг на среды ES6 +, вы можете использовать .entries()
метод, описанный в ответе Arnavion .
Array.some()
и вернуть false на итерации, которую хотите остановить. Это не так ясно или красиво, как a, break
но с ним можно справиться. Лично мне не нравится это, я бы , вероятно , переписать итерацию каким - либо иным образом :) см stackoverflow.com/questions/2641347/...
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.
«Старый школьный 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
См. Демонстрацию
for..in
также может дать вам больше, чем вы ожидали, поскольку он также включает все функции, объявленные для объекта. Например:for (var prop in window.document) { console.log(prop); }