1. 30 回以上の公開作品を絞り込む
  2. 100 回以上に絞ると 2 件になる
  3. 条件に合う作品が 1 件も無い
  4. JavaScript タグの作品が無ければ jsTitle は null
  5. 空配列なら空の結果を返す
コース一覧
モダンJavaScript:データ処理とコード設計
filter と find で絞り込む

モダンJavaScript:データ処理とコード設計

配列の map・filter・reduce・sort、クロージャと高階関数、オブジェクトとクラス、エラー設計、正規表現を学ぶ全 36 レッスン(665 分)のコースです。ローカルの作品データを題材に、表示とデータを分け、絞り込み・並び替え・入力検証までを組み立てます。Promise、fetch、API 通信、モジュールは次のコースで扱います。

1
土台をそろえる
01. このコースで育てるもの15分
02. strict mode が先に教えてくれる間違い15分
03. 表示とデータを切り分ける20分
04. 第1章まとめクイズ10分
2
配列をパイプラインで扱う
01. map で形を変える20分
02. filter と find で絞り込む20分
03. reduce でひとつにまとめる20分
04. sort と比較関数20分
05. 分類してまとめる groupBy20分
06. つなげて組み立てる20分
07. つくる 作品一覧の絞り込みと並び替え30分
08. 第2章まとめクイズ10分
3
関数を道具にする
01. クロージャで状態を閉じ込める20分
02. 設定を覚えた関数をつくる20分
03. 関数を返す関数20分
04. 副作用のない関数20分
05. 第3章まとめクイズ10分
4
オブジェクトを扱いきる
01. 分割代入で必要な値だけ取り出す20分
02. スプレッドとレストで組み替える20分
03. keys と values と entries20分
04. ビット演算でフラグをまとめる20分
05. 第4章まとめクイズ10分
5
クラスで型をつくる
01. クラスとインスタンス20分
02. private フィールドとアクセサ20分
03. 継承と super20分
04. 多態と static20分
05. つくる 作品コレクションをクラスにする30分
06. 第5章まとめクイズ10分
6
エラーを設計する
01. try catch finally20分
02. 自分でエラーを投げる20分
03. 失敗を画面に出す25分
04. 第6章まとめクイズ10分
7
正規表現
01. 正規表現のきほん20分
02. 入力を検証する20分
03. 置換とキャプチャ20分
04. 第7章まとめクイズ10分

filter と find で絞り込む

filter は配列、find は 1 件
解説

このレッスンで分かること

  • filter は条件に合う要素だけを集めた新しい配列を返します
  • find は最初の 1 件そのものを返し、見つからなければ undefined になります

絞り込むたびに、空の配列と for 文を書いている

入門では、条件に合う作品を取り出すのに空の配列を用意し、for-of でまわし、条件に合わないものを飛ばし、残りを push していました。条件が「公開ずみ」「新しい年だけ」「タグ別」と増えるたびに、同じ形の関数が 1 本ずつ増えていきます。

減らす担当は filter です。渡した関数が true を返した要素だけが、新しい配列に残ります。

JavaScript

const works = [ { title: "プロフィールサイト", year: 2026, tags: ["HTML", "CSS"], published: true }, { title: "自己紹介カード", year: 2026, tags: ["HTML"], published: true }, { title: "作品ギャラリー", year: 2025, tags: ["JavaScript"], published: false } ]; const publishedWorks = works.filter((work) => work.published); // 2 件。元の works は 3 件のまま

条件を重ねたいときは、そのまま論理演算子でつなぎます。filter を 2 回に分けても結果は同じですが、関係のある条件なら 1 つにまとめたほうが読めます。

JavaScript

const recentCss = works.filter((work) => work.year === 2026 && work.tags.includes("CSS"));

戻り値は必ず配列です。1 件も合わなくても null にはならず、長さ 0 の配列が返ります。この性質のおかげで、そのあとに別のメソッドをつないでも落ちません。

解説

0 件かどうかを知りたいときは length を見ます。結果そのものを真偽値として見ると、空配列は truthy なので必ず true になり、判定が効きません。

見つからなかった 1 件で落ちる

一覧から特定の 1 件を取り出したいなら find です。条件に合った最初の要素を、配列ではなくその要素そのものとして返します。

JavaScript

const target = works.find((work) => work.title === "自己紹介カード"); console.log(target.year); // 2026

問題は見つからなかったときです。find は undefined を返すので、そのまま .year と書くと TypeError で止まります。手元のテストデータでは必ず見つかるので気付かず、本番のデータで初めて落ちます。

JavaScript

const found = works.find((work) => work.title === "まだ無い作品"); const year = found ? found.year : null;

受け取ってから確かめる。この 2 行の形を体に入れてください。find を書いたら次の行は必ず存在確認、と決めておくと事故が消えます。

何件ほしいのかで選ぶ

メソッド戻り値見つからないとき走査
filter新しい配列長さ 0 の配列最後まで見る
find要素そのものundefined見つかった時点で止まる
findIndex添字の数値-1見つかった時点で止まる
some真偽値false見つかった時点で止まる

存在の有無だけを知りたいのに find を使うと、受け取った要素を使わない不自然なコードになります。そういうときは some を使うと、意図がそのまま行に出ます。配列の中に特定の値が入っているかを見るなら includes です。タグのような文字列の配列と相性がよく、filter の条件の中でよく使います。

よくある間違い

  • 条件ではなく値を返してしまう — works.filter((work) => work.title) は戻り値を真偽値として見るので、タイトルが空でないものが全部残ります。=== などで比べた結果を返してください
  • 1 件しか要らないのに filter を使う — 添字 0 で取り出す書き方は動きますが、最後まで走査するうえ、空配列のときの扱いが増えます。1 件と決まっているなら find のほうが素直です
  • 項目が欠けた要素で落ちる — work.tags.includes(...) は tags を持たない作品が 1 件混ざるだけで止まります。データの形が揺れるなら、条件の前に値があるかを確かめるか、そもそも配列を必ず持つ形にそろえます

要件

  1. 関数名は pickPopularWorks とし、引数は作品の配列 works と数値 minViews の 2 つを受け取る
  2. published が true かつ views が minViews 以上の作品だけを対象にする
  3. 戻り値は titles と jsTitle の 2 つのキーを持つオブジェクトにし、titles は対象作品のタイトルの配列にする
  4. jsTitle は対象の中で tags に JavaScript を含む最初の作品のタイトルとし、無ければ null にする

入出力例

pickPopularWorks([{"id":1,"published":true,"tags":["HTML","CSS"],"title":"プロフィールサイト","views":120,"year":2026},{"id":2,"published":true,"tags":["HTML"],"title":"自己紹介カード","views":48,"year":2026},{"id":3,"published":true,"tags":["HTML","CSS"],"title":"スキル一覧の表","views":32,"year":2025},{"id":4,"published":false,"tags":["JavaScript"],"title":"作品ギャラリー","views":8,"year":2025},{"id":5,"published":true,"tags":["JavaScript"],"title":"学習ログ","views":200,"year":2024}], 30) → {"jsTitle":"学習ログ","titles":["プロフィールサイト","自己紹介カード","スキル一覧の表","学習ログ"]} pickPopularWorks([{"id":1,"published":true,"tags":["HTML","CSS"],"title":"プロフィールサイト","views":120,"year":2026},{"id":2,"published":true,"tags":["HTML"],"title":"自己紹介カード","views":48,"year":2026},{"id":3,"published":true,"tags":["HTML","CSS"],"title":"スキル一覧の表","views":32,"year":2025},{"id":4,"published":false,"tags":["JavaScript"],"title":"作品ギャラリー","views":8,"year":2025},{"id":5,"published":true,"tags":["JavaScript"],"title":"学習ログ","views":200,"year":2024}], 100) → {"jsTitle":"学習ログ","titles":["プロフィールサイト","学習ログ"]} pickPopularWorks([{"id":1,"published":true,"tags":["HTML","CSS"],"title":"プロフィールサイト","views":120,"year":2026},{"id":2,"published":true,"tags":["HTML"],"title":"自己紹介カード","views":48,"year":2026},{"id":3,"published":true,"tags":["HTML","CSS"],"title":"スキル一覧の表","views":32,"year":2025},{"id":4,"published":false,"tags":["JavaScript"],"title":"作品ギャラリー","views":8,"year":2025},{"id":5,"published":true,"tags":["JavaScript"],"title":"学習ログ","views":200,"year":2024}], 500) → {"jsTitle":null,"titles":[]} pickPopularWorks([{"id":1,"published":true,"tags":["HTML","CSS"],"title":"プロフィールサイト","views":120,"year":2026},{"id":2,"published":true,"tags":["HTML"],"title":"自己紹介カード","views":48,"year":2026}], 0) → {"jsTitle":null,"titles":["プロフィールサイト","自己紹介カード"]} pickPopularWorks([], 0) → {"jsTitle":null,"titles":[]}

ヒント

まず filter で対象を絞り、その結果に対して find を呼びます。元の works に対して find を呼ぶと条件がずれます。

タグの判定は tags.includes("JavaScript") で書けます。filter の条件は論理演算子でつなぎます。

find の戻り値は undefined になり得ます。そのまま title を読まず、三項演算子で null に置き換えてから返します。

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/03/27·更新 2026/08/26

関連レッスン

  • reduce でひとつにまとめる

    配列を 1 つの値にたたみ込む reduce を学びます。初期値の役割と、オブジェクトにまとめる書き方を身につけます。

  • sort と比較関数

    sort が元の配列を並べ替えて壊してしまう点と、比較関数を省くと数値が文字列として比べられる点を押さえます。複製してから並べ替える書き方を身につけます。

  • 分類してまとめる groupBy

    配列の要素をキーごとのまとまりに分ける書き方を学びます。reduce の初期値を空オブジェクトにして、年ごとに作品を束ねます。

  • つなげて組み立てる

    filter と sort と map を 1 本の流れにつないで表示用のデータを組み立てます。つなぐ順番で結果も計算量も変わることを確かめます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 配列サイズ固定の同型データの集まり
  • 関数処理に名前を付けて再利用できる単位
  • 論理演算子and=両方True、or=どちらかTrue、not=反転。
  • 演算子//は切り捨て除算(7 // 2 = 3)。
  • 戻り値呼び出し元への返答を表す点線矢印
  • メソッドクラスに属する関数
  • テストバグを見つける工程
  • 引数位置引数=順番で渡す。
main.js
学習モード
エディタを読み込んでいます

メモ

filter と find で絞り込む

⌘S で保存