【JavaScript】ジェネレータを使って月の表示をループする

JavaScriptにはジェネレータという機能があります。今回はジェネレータを使って簡単なサンプルを作ってみます。

作るもの

1月⇒2月⇒3月…と表示していき、12月の次はまた1月に戻るようなものを作ります。

ジェネレータ

ジェネレータのコードは以下のようになります。function*のようにアスタリスクをつけるとジェネレータになります。

function* createLoopMonth(){
  let month = 1 //(1)
  while(true){ //(2)
    yield month + '月' //(3)
    if(month <= 11){ //(4)
      month += 1
    }else{
      month = 1
    }
  }
}

(1)初期値のセット

最初は1月なので初期値として1をセットしておきます。

(2)無限ループするようにしておく

何度でも呼び出せるように、無限ループにしておきます。

yieldキーワードによって、要求されるまで処理は停止されるので、実際に無限ループが発生することはありません。

(3)yieldキーワードで値を返す

ジェネレータに対して値を要求すると、yieldキーワードによって値が返されます。

(4)次に返す値をセットしておく

yieldキーワードによって例えば「1月」が返されたら、次は「2月」を返す必要があります。そのためmonth変数を次の月に書き換えておきます。

呼び出す

このジェネレータを使って実際に値を呼び出すコードは以下の通りです。next()で次の値を要求します。

let monthGenerator = createLoopMonth()
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())
console.log(monthGenerator.next())

結果は以下のようになります。

{ value: '1月', done: false }
{ value: '2月', done: false }
{ value: '3月', done: false }
{ value: '4月', done: false }
{ value: '5月', done: false }
{ value: '6月', done: false }
{ value: '7月', done: false }
{ value: '8月', done: false }
{ value: '9月', done: false }
{ value: '10月', done: false }
{ value: '11月', done: false }
{ value: '12月', done: false }
{ value: '1月', done: false }

これで、好きなときにnext()を呼び出すことで、月をループして表示させることができるようになりました。

まとめ

ジェネレータはとても便利な機能なので、色々使い道を探してみてください!

コメントする

メールアドレスが公開されることはありません。