CHAPTER 6 · 5 LESSONS · 65 問

配列をあつかう道具

配列を1件ずつ処理する、探す、絞る、作りかえる。くり返しを短く正確に書けるようになる。

配列を扱うとき、これまでは for を書いてきた。番号を0から始めて、length まで1ずつ増やして、array[i] で取り出す。動くけれど、毎回同じ骨組みを書くことになるし、書きまちがえやすい<<= にしただけで、存在しない要素を取りに行ってしまう。

この章で覚えるのは、その定型を肩代わりしてくれる道具だよ。「配列に対してやりたいこと」は実のところ数種類しかない、という発見でもある。

  • 全部に同じことをする — 1件ずつ順に処理する
  • 条件に合うものだけ残す — 絞り込む
  • 中身を作りかえて新しい配列にする — 変換する
  • 条件に合う最初の1件を探す — 検索する

やりたいことがこのどれかなら、対応する道具を使えば1行で書ける。番号の管理から解放されるので、やりたいことがそのままコードに出るfor で10行書いていたものが1行になり、しかも読んだ瞬間に意図が分かる、ということが起きるよ。

ここで覚えておきたい区別が、元の配列を変えるか、新しい配列を作るかだ。絞り込みや変換の道具は、元の配列はそのままにして新しい配列を返す。元のデータが勝手に書きかわらないので、後から「元はどうだったっけ」と困らずに済む。データを直接書きかえない書き方は、バグを減らすうえでとても効いてくる。

これらの道具は、渡し方が少し変わっている。処理そのものを引数として渡すのだ。「この配列の各要素に、この処理をあててほしい」という形で書く。はじめて見ると面食らうかもしれない。その正体は次の章で扱うので、ここでは「そういう書き方をするものだ」と受け入れて、まず使えるようになろう。

道具どうしはつなげて使えるのも強みだよ。「条件で絞ってから、中身を作りかえて、順に表示する」を、ひと続きに書ける。処理の流れが上から下へ素直に並ぶので、読む人は左から右へ目で追うだけで何をしているか分かる。for の中に if を入れて、その中でさらに何かをして…という入れ子と比べると、見通しの差は大きい。

つまずきやすいところも挙げておこう。変換する道具は必ず新しい配列を返すので、受け取る変数を用意しないと結果がどこにも残らない。「動いているのに何も出ない」というときは、返ってきた値を捨てていないか確かめてみよう。

もうひとつ、1件ずつ処理するだけの道具は値を返さない。これも取りちがえやすい。表示するだけならそれでいいけれど、結果を集めたいなら変換の道具を使う。「やりたいのは表示か、それとも新しい配列か」を先に決めるのがコツだよ。

現場のコードでは、for よりこちらのほうがよく見かける。読めないと他人のコードが追えないし、書けるとコードが短く安全になる。ここは投資に見合う章だよ。

とはいえ for が悪いわけではない。途中で抜けたいときや、複雑な条件で回すときは for のほうが素直に書ける。道具が増えたのであって、前のものが要らなくなったのではないよ。

名前もそれぞれ意味を持っている。「対応づける」「ふるいにかける」「畳み込む」といった元の言葉を知っておくと、記憶に引っかかりやすくなるよ。

学ぶときのコツは、まず for で書いてから道具に置きかえてみることだ。同じ結果になることを確かめながら進めると、その道具が中で何をしているかが腑に落ちる。丸暗記ではなく、「これは要するに for のあの形だ」と分かった状態で使えるようになるよ。

この章のレッスン

配列のメソッド

  1. 71配列のうしろに足すpush メソッドを使って、配列の末尾に要素を足せるようにしよう。 問題へ
  2. 72全要素に同じ処理をするforEach メソッドに関数を渡して、配列の全要素へ同じ処理を届けよう。 問題へ
  3. 73条件に合う1件を探すfind メソッドに条件の関数を渡して、条件に合う最初の要素を取り出そう。 問題へ
  4. 74条件に合うものを集めるfilter メソッドで、条件に合う要素だけを集めた新しい配列を作ろう。 問題へ
  5. 75全要素を作り変えるmap メソッドで、各要素を変換した結果を並べた新しい配列を作ろう。 問題へ

つぎは「関数をわたす」。関数そのものを値として別の関数に渡す。配列の道具の中で起きていたことの正体を見る。