回答:
.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..
}
反復可能なバージョン
これは、--downlevelIteration
コンパイラオプションを使用してコンパイルする場合、ES3またはES5をターゲットとするときに機能します。
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を返すことができます。それはほど明確またはきれいbreak
ではありませんが、それは仕事を成し遂げるでしょう。個人的には好きではありません。おそらく他の方法でイテレーションを
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries
for (var [key, item] of someArray.entries()) { ... }
TS では、ランタイムがイテレータをサポートする必要があるので、 ES2015をターゲットにする必要があります。もちろん、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); }