1. ホーム
  2. for-loop

[解決済み】TypeScript for ... of with index / key?

2022-04-12 06:59:01

質問

説明の通り こちら 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の回答 .