【超便利】TypeScript for ... ofループ:インデックス/キーを活用してコードをスッキリさせよう!

2024-04-02

TypeScriptにおける「for ... of」ループとインデックス/キー

TypeScriptでは、for ... ofループを使用して、イテレータブルなオブジェクト(配列、文字列、Mapなど)の要素を反復処理できます。

このループには、要素のインデックスやキーを取得できるオプションがあります。

構文

for (const [key, value] of iterable) {
  // ...
}

  • 配列
const arr = [1, 2, 3];

for (const [index, value] of arr.entries()) {
  console.log(`Index: ${index}, Value: ${value}`);
}

// 出力:
// Index: 0, Value: 1
// Index: 1, Value: 2
// Index: 2, Value: 3
  • Map
const map = new Map([
  ["a", 1],
  ["b", 2],
  ["c", 3],
]);

for (const [key, value] of map) {
  console.log(`Key: ${key}, Value: ${value}`);
}

// 出力:
// Key: a, Value: 1
// Key: b, Value: 2
// Key: c, Value: 3

インデックス/キーの型

keyvalueの型は、イテレータブルなオブジェクトによって異なります。

  • 配列
    • key: number型(インデックス)
    • value: 配列の要素の型
  • Map
    • key: マップのキーの型

その他の注意点

  • for ... ofループは、イテレータブルなオブジェクトに対してのみ使用できます。
  • for ... ofループは、breakcontinueステートメントで使用できます。
  • for ... ofループは、async/awaitと組み合わせて使用できます。

関連用語

  • イテレータ
  • forループ
  • foreach



const arr = ["a", "b", "c"];

for (const [index, value] of arr.entries()) {
  console.log(`Index: ${index}, Value: ${value}`);
}

出力:

Index: 0, Value: a
Index: 1, Value: b
Index: 2, Value: c

Mapのキーと値をそれぞれ出力

const map = new Map([
  ["a", 1],
  ["b", 2],
  ["c", 3],
]);

for (const [key, value] of map) {
  console.log(`Key: ${key}, Value: ${value}`);
}
Key: a, Value: 1
Key: b, Value: 2
Key: c, Value: 3
const obj = {
  name: "John Doe",
  age: 30,
  city: "New York",
};

for (const [key, value] of Object.entries(obj)) {
  console.log(`Key: ${key}, Value: ${value}`);
}
Key: name, Value: John Doe
Key: age, Value: 30
Key: city, Value: New York

文字列の各文字を出力

const str = "Hello, world!";

for (const char of str) {
  console.log(char);
}
H
e
l
l
o
,
 
w
o
r
l
d
!

配列の要素を2つずつ処理

const arr = [1, 2, 3, 4, 5];

for (let i = 0; i < arr.length; i += 2) {
  const first = arr[i];
  const second = arr[i + 1];

  console.log(`First: ${first}, Second: ${second}`);
}
First: 1, Second: 2
First: 3, Second: 4



TypeScriptにおける「for ... of」ループの代替方法

従来の「for」ループ

const arr = [1, 2, 3];

for (let i = 0; i < arr.length; i++) {
  const value = arr[i];

  // ...
}

メリット:

  • シンプルで分かりやすい
  • インデックスを自分で管理する必要がある
  • 冗長なコードになる

forEachメソッド

const arr = [1, 2, 3];

arr.forEach((value) => {
  // ...
});
  • 簡潔に記述できる
  • インデックスを取得できない
  • breakcontinueステートメントが使えない

mapやfilterメソッド

const arr = [1, 2, 3];

const doubled = arr.map((value) => value * 2);
const evens = arr.filter((value) => value % 2 === 0);

// ...
  • 配列を別の配列に変換できる
  • イテレーション以外の処理を行う場合は、複数のメソッドを組み合わせる必要がある

ジェネレータ

function* generateNumbers() {
  for (let i = 1; i <= 10; i++) {
    yield i;
  }
}

const generator = generateNumbers();

for (const value of generator) {
  console.log(value);
}
  • イテレーションをより細かく制御できる
  • 理解するのが難しい
  • シンプルで分かりやすいコードを求める場合は、「for ... of」ループや従来の「for」ループを使うのが良いでしょう。
  • 簡潔に記述したい場合は、forEachメソッドを使うのが良いでしょう。
  • 配列を別の配列に変換したい場合は、mapfilterメソッドを使うのが良いでしょう。
  • イテレーションをより細かく制御したい場合は、ジェネレータを使うのが良いでしょう。

状況に応じて、他の方法も検討してみてください。


for-loop foreach typescript


TypeScriptコードをより安全に:TSLintで"no-string-literal"ルールを活用

TypeScript と TSLint は、静的解析ツールを使用して TypeScript コードをより安全で保守しやすいものにするための強力なツールです。 TSLint は、潜在的な問題を特定し、コードのスタイルと一貫性を維持するのに役立つルールを提供します。...


Angular TypeScriptで*ngForにフィルターを適用する

*ngFor ディレクティブにパイプを追加することで、フィルターを適用することができます。パイプは、データの変換やフィルタリングを行う関数です。例:上記の例では、items 配列内の active なアイテムのみを表示するために、filter パイプを使用しています。filter パイプは、最初の引数としてフィルター条件を受け取ります。...


TypeScriptの継承と実装の奥深さ:抽象クラスとインターフェースで探求する高度な設計

継承 (extends) と 実装 は、抽象クラスとサブクラスの関係性を定義する2つの主要な概念です。継承 は、サブクラスが抽象クラスの構造と機能を継承することを意味します。具体的には、サブクラスは抽象クラスの:プロパティ: データを保持する変数...


Angular、TypeScript、Sublime Text 3 の連携:フロントエンド開発をパワーアップ

手順:Package Control をインストール: Sublime Text 3 を開き、Ctrl+Shift+P または Cmd+Shift+P を押してコマンドパレットを開きます。 Package Control: Install Package と入力し、Enter キーを押します。...


TypeScript: 'index.d.ts' はモジュールではないというエラーを3つの方法で解決する

TypeScript でサードパーティ製ライブラリを使用する場合、そのライブラリの型情報を提供する . d.ts ファイルが必要となります。しかし、まれに index. d.ts ファイルが読み込まれず、以下のエラーが発生することがあります。...


SQL SQL SQL SQL Amazon で見る



JavaScript: 配列処理をもっと便利に!forEachのショートサーキットテクニック

最も簡単な方法は、例外を投げる方法です。このコードでは、el が 2 の場合に BreakException 例外を投げ、ループ処理を中断しています。ただし、例外処理は本来エラー処理用なので、乱用は避けたほうが良いでしょう。some メソッドは、配列要素のうち1つでも条件に合致するかどうかを判定します。この性質を利用して、ループ処理を中断することができます。


オブジェクトと配列のループ処理を極める!JavaScriptループ処理の包括的なガイド:For...Inループ、foreachループ、その他の方法も紹介

JavaScriptでオブジェクトや配列を反復処理するには、様々なループ構文が用意されています。その中でも、「For. ..Inループ」と「foreachループ」は、オブジェクトのプロパティや配列の要素を効率的に処理する際に役立つループ構文です。


【徹底解説】JavaScriptで配列をループする方法:forEach編

forEachループは、配列の各要素に対して順番に処理を実行する関数です。ループ内で処理したい内容を記述した関数を引数として渡すことで、配列の各要素に対してその関数が実行されます。forEachループのメリット簡潔で分かりやすいコードを書ける


JavaScriptでループカウンター/インデックスを取得する方法

しかし、for. ..of 構文は、ループカウンタやインデックスを直接取得できないという弱点があります。これは、for. ..of 構文がイテラブルオブジェクトの 値 にのみ焦点を当てているためです。ループカウンタやインデックスが必要な場合は、以下の代替方法を検討する必要があります。


JavaScript開発者必見!TypeScriptでインターフェース型チェックを駆使して安全で高品質なコードを実現

このチュートリアルでは、TypeScriptにおけるインターフェース型チェックについて、分かりやすく説明します。インターフェースは、interface キーワードを使用して定義されます。インターフェースには、プロパティの名前、型、オプションでアクセス修飾子を含めることができます。


JavaScript の配列をもっと便利にループ処理! forEach、map、filter、reduce メソッドを紹介

処理対象for. ..in: 配列の インデックス番号 と プロパティ の両方を処理します。for. ..of: 配列の 要素の値 のみ処理します。ループ順序for. ..in: インデックス番号に基づいて 昇順 にループします。使用例for


TypeScriptでオブジェクトの型を定義する:インターフェース、型エイリアス、クラス、型パラメーター、discriminated unions徹底解説

インターフェースは、オブジェクトの構造を定義するための型です。インターフェースには、オブジェクトが持つべきプロパティの名前と型を記述します。インターフェースは、オブジェクトの型チェックやコード補完などの機能を提供します。上記の例では、Personというインターフェースを定義しています。Personインターフェースは、nameという文字列型プロパティと、ageという数値型プロパティを持つオブジェクトを表します。