web-dev-qa-db-ja.com

...のためのTypeScriptはインデックス/キーで?

説明したように ここ TypeScriptはforeachループを導入します。

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

しかし、インデックスやキーはありませんか?私は以下のようなものを期待するでしょう:

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

.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..
}

反復可能バージョン

--downlevelIterationコンパイラオプションを使用してコンパイルした場合、これはES3またはES5をターゲットにしている場合に機能します。

function* toItemIndexes<T>(items: T[] | IterableIterator<T>) {
    let index = 0;
    for (const item of items) {
        yield { item, index };
        index++;
    }
}
185
David Sherret

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 のようなものを使用することもできます。

22
Arnavion

「オールドスクールジャバスクリプト」を助けに(慣れていない人や関数型プログラミングを愛する人のための)

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

コレクションを処理するときに for..in TypeScript演算子を使用してインデックスにアクセスできます。

var test = [7,8,9];
for (var i in test) {
   console.log(i + ': ' + test[i]);
} 

出力:

 0: 7
 1: 8
 2: 9

デモ を参照してください。

11
Karanvir Kang

または別の古い学校の解決策:

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