filter と find で絞り込む
このレッスンで分かること
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 件混ざるだけで止まります。データの形が揺れるなら、条件の前に値があるかを確かめるか、そもそも配列を必ず持つ形にそろえます
要件
- 関数名は pickPopularWorks とし、引数は作品の配列 works と数値 minViews の 2 つを受け取る
- published が true かつ views が minViews 以上の作品だけを対象にする
- 戻り値は titles と jsTitle の 2 つのキーを持つオブジェクトにし、titles は対象作品のタイトルの配列にする
- 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":[]}