JavaScriptでfor…inとfor…ofを使う

JavaScript_icon JavaScript
javascript eye catch picture
この記事は約6分で読めます。

この記事は、以下の方を対象に書いています。

  • JavaScriptの便利機能をもっと知りたい
  • JavaScriptって拡張for文ないの?って思っている方

for … in文

for … in文は、繰り返し処理を行える制御構文です。

構文は、Javaの拡張for文に似た構文を使います。

下記の結果のように、配列の場所(要素番号)が一つずつvalに入った状態になります。

const array = ['aaa', 'bbb', 'ccc']

for (const val in array) {
    console.log(val)
}

// 0
// 1
// 2

使い道としては、「配列の要素番号が〇の時、△の処理をしたい」という条件で使うことも可能です。

オブジェクトをfor … in

for … in文は、配列だけではなく、オブジェクトに対しても使用することが可能です。

オブジェクトについて、思い出したい方は以下の記事も覗いてみてください!

ちなみに、for … of文では、エラーが出ます。

では、実際に見てみましょう。

const fanta = {orange: 'オレンジ', grape: 'グレープ', melon: 'メロン'}

for (const val in fanta) {
    console.log(val)
}

// orange
// grape
// melon

上記のように、キーの値のみが取得できます。

値も一緒に取得したい場合は、下記のように変更します。

const fanta = {orange: 'オレンジ', grape: 'グレープ', melon: 'メロン'}

for (const val in fanta) {
    console.log(`key:${val} value:${fanta[val]}`)
}

// key:orange value:オレンジ
// key:grape value:グレープ
// key:melon value:メロン

実践的サンプルコード

次は、実際に使いそうなサンプルコードを紹介します。

オブジェクトの値の型が数字に変換できない文字列だった時だけ、

処理を行わないコードを書いてみます。

const obj = {
    num1: 10,
    num2: 20,
    num3: 'fake',
    num4: 40,
    num5: 'fake',
}

for (const val in obj) {
    // isNaNメソッドで数字に変換できるか確認
    if (isNaN(Number(obj[val]))) {
        // 何もせず、次の処理に移動
        continue
    }
    // 値を10倍して表示
    console.log(Number(obj[val]) * 10)
}

// 100
// 200
// 400

このコードでfor…of文を使用しないのには、理由があります。

for…of文は、反復可能なオブジェクト(配列、文字列、Set、Mapなど)に使用するのが一般的です。

その証拠に下記のコードは、エラー(TypeError: obj is not iterable)が発生します。

const obj = {
    num1: 10,
    num2: 20,
    num3: 'fake',
    num4: 40,
    num5: 'fake',
}

for (let val of obj) {
    console.log(val)
}

for … of文

for…of文は、反復可能なオブジェクト(配列、文字列、Set、Mapなど)に使用するのが一般的です。

でないとエラーが発生してしまいます。

配列の場合

配列は反復可能なオブジェクトです。

そのため、for…of文の対象になります。

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

for (let number of numbers) {
    console.log(number);
}

// 1
// 2
// 3
// 4
// 5

文字列の場合

文字列も反復可能なオブジェクトです。

そのため、for…of文の対象になります。

const str = 'abc'

for (let char of str) {
    console.log(char)
}

// a
// b
// c

Setの場合

Setも反復可能なオブジェクトです。

そのため、for…of文の対象になります。

const set = new Set(['aaa', 'bbb', 'ccc'])

for (let val of set) {
    console.log(val)
}

// aaa
// bbb
// ccc

Setについては、以下の記事で解説していますので、参考にしてみてください。

Mapの場合

Mapも反復可能なオブジェクトです。

そのため、for…of文の対象になります。

ただ、Mapの場合は少し特殊な記述になります。

下記のような書き方をすることで、キーとバリューを分けて取得することが可能です。

ちなみに、通常通りの「for (let value of map) {}」 の書き方でも問題ありません。

const map = new Map()

map.set('aaa', 1)
map.set('bbb', 2)
map.set('ccc', 3)

for (let [key, value] of map) {
    console.log(`${key} ${value}`)
}

// aaa 1
// bbb 2
// ccc 3

実践的サンプルコード

ここでは、for…inで紹介したサンプルコードをfor…ofに書き直してみます。

const obj = {
    num1: 10,
    num2: 20,
    num3: 'fake',
    num4: 40,
    num5: 'fake',
}

// Object.entries()メソッドを使用
for (let [key, value] of Object.entries(obj)) {
    // isNaNメソッドで数字に変換できるか確認
    if (isNaN(Number(value))) {
        // 何もせず、次の処理に移動
        continue
    }
    // 値を10倍して表示
    console.log(Number(value) * 10)
}

// 100
// 200
// 400

まとめ

ここまで読んでいただきありがとうございます。

for…inとfor…ofの使い方について、紹介しました。

上記で紹介した通り、どちらもメリットとデメリットがあり、

状況によって使い分ける必要があります。

さらに理解を深めるには、サンプルコードを書いたり、書籍を読むのがおすすめです。

コメント

タイトルとURLをコピーしました