CHAPTER 2 · 21 LESSONS · 267 問

くり返しとデータの持ち方

同じ処理を何回もくり返し、たくさんの値をまとめて持つ。プログラムが一気に実用的になるところ。

前の章で書いたプログラムには、大きな限界がひとつあった。扱える値の数が、書いた行数の分しかないということだ。3人ぶんのデータを出したいなら3行、100人ぶんなら100行。これでは現実のアプリは作れない。

この章で、その壁を壊す。使う道具は2つ。くり返しまとめて持つ入れ物だよ。

くり返しは whilefor の2つの書き方で覚える。while は「条件が成り立つあいだ、ずっと同じことをする」。for は「回数を決めて、その分だけ同じことをする」。どちらも同じことができるけれど、回数がはっきりしているときは for のほうが読みやすい。

ここで一度は必ず出会うのが 無限ループ。終わる条件を書きまちがえると、プログラムが止まらなくなる。この教材では一定時間で自動的に止めて、何が起きたかを表示するようにしてある。こわがらずに、わざと作ってみるといい。「なぜ終わらないのか」を自分で説明できるようになれば、それはもう理解したということだよ。

入れ物のほうは 配列 から。["りんご", "みかん", "ぶどう"] のように、値を順番に並べて1つの名前で持つ。中身は fruits[0] のように0から数える番号で取り出す。1からではなく0から、というのは最初は必ず戸惑うところで、「最後の要素は length - 1 番目」という言い回しに慣れるまで少しかかる。

もうひとつが オブジェクト。配列が「番号で取り出す入れ物」なら、オブジェクトは「名前で取り出す入れ物」だ。{ name: "ゆい", age: 15 } と書いて person.name で取り出す。人やお店や商品のように、いくつかの項目がひとまとまりになっているものを表すのに向いている。

この2つは組み合わせて使うのが本番だよ。「オブジェクトを配列に並べる」という形にすると、名簿や商品一覧といった現実のデータがそのまま表現できる。そこにくり返しをかければ、100件だろうと1000件だろうと同じコードで処理できる。

章の終わりでは、値が入っていないときに出てくる undefined も扱う。存在しない番号や項目を取りに行ったときに返ってくる値で、これを知らないとエラーの原因が読めない。

くり返しと条件分岐を組み合わせるところも、この章の山場のひとつだ。「配列を1件ずつ見て、条件に合うものだけ表示する」という形は、この先いやというほど書くことになる。合計を出す、最大値を探す、件数を数える。どれも同じ骨組みでできているよ。

ここで身につけたい書き方がひとつある。合計を入れる変数はループの外で用意するということだ。中で作ってしまうと、1周するたびに0に戻ってしまう。「どこで変数を作るか」が結果を変えるという体験は、この章で初めて出てくるものだよ。

うまく動かないときの調べ方も覚えておこう。ループの中で console.log を書いて、1周ごとに変数がどうなっているかを出してみる。頭の中で追いかけるより、実際に出したほうが速いし確実だ。この教材には1行ずつ実行して変数の中身を見られる機能もあるので、行き詰まったら使ってみてほしい。

くり返し・配列・オブジェクト・条件分岐がそろうと、書けるものの幅が一気に広がる。この章を抜けたあたりから「プログラムを書いている」という感覚が出てくるはずだよ。逆にここがあいまいなまま先へ進むと、あとの章がつらくなる。この章はゆっくりやる価値がある

この章のレッスン

同じ処理をくり返す

  1. 20ここまでのおさらい変数と条件分岐を思い出してから、新しい章に入っていこう。 問題へ
  2. 21while文で繰り返す条件が成り立つあいだ、同じ処理を何度でも繰り返してもらおう。 問題へ
  3. 22for文で繰り返すスタート・条件・更新を1行にまとめた、繰り返しのもうひとつの書き方を覚えよう。 問題へ
  4. 232つの繰り返しを使い分けるwhile と for のどちらを選ぶか、判断のしかたを身につけよう。 問題へ

値を並べて持つ(配列)

  1. 24配列でまとめて持つ複数の値をひとつの入れ物にまとめて持つ書き方を覚えよう。 問題へ
  2. 25配列から1つ取り出す番号を指定して、配列の中身をひとつだけ取り出そう。 問題へ
  3. 26配列の中身を書き換える番号を指定して、配列の要素をあとから入れ替えよう。 問題へ
  4. 27配列を繰り返しで処理する番号を1つずつ増やしながら、配列の要素を順番に扱おう。 問題へ
  5. 28配列の長さを使う.length で要素の数を取り出し、繰り返す回数を配列に決めてもらおう。 問題へ

名前をつけて持つ(オブジェクト)

  1. 29オブジェクトで名前をつけて持つ名前と値の組で情報をまとめる、配列とは別のデータの持ち方を覚えよう。 問題へ
  2. 30プロパティを読み書きする名前を指定して値を取り出したり、書き換えたり、あとから足したりしよう。 問題へ
  3. 31配列にオブジェクトを入れる同じ形のオブジェクトを配列に並べて、入れ子から値を取り出そう。 問題へ
  4. 32入れ子を繰り返しで処理するオブジェクトの配列を for でまわして、一覧の表示や集計をしよう。 問題へ

値が無いとき

  1. 33存在しない値をのぞいてみる無い番号や無いプロパティを取り出したときに返る、undefined という値を知ろう。 問題へ
  2. 34undefined を判定して逃がす値が無いときを条件分岐で見つけて、別の表示や処理に切り替えよう。 問題へ

組み合わせて解く

  1. 35章のまとめ問題配列・オブジェクト・繰り返し・条件分岐を組み合わせて解く総合演習。まとめなので基礎3問は無く、練習10問だけだよ。 問題へ
  2. 36出力の形を整える見出し・番号・区切り・単位をつけて、読みやすい出力に仕上げる総合演習。まとめなので基礎3問は無く、練習10問だけだよ。 問題へ

さらに組み合わせの練習

  1. 37forと配列を組み合わせよう配列の全要素を for 文で順番に処理する、いちばん大事なパターンを覚えよう。 問題へ
  2. 38forとifと配列を組み合わせよう「全要素の中から条件に合うものだけ」を処理できるようになろう。 問題へ
  3. 39forとif-elseと配列を組み合わせよう全要素を「どちらか一方」に振り分ける処理を書けるようになろう。 問題へ
  4. 40forとif-else ifと配列を組み合わせよう全要素を三段階以上に分類する、集大成のパターンに挑戦しよう。 問題へ

つぎは「処理をまとめる(関数)」。ひとまとまりの処理に名前をつけて、値を渡し、結果を受け取る。同じコードを何度も書かなくてよくなる。