filter と find

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

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

  • filter条件を満たす全要素、新しい配列を返す
  • find最初の 1 件、見つからなければ undefined
  • some少なくとも 1 つ が条件を満たすか、every全部 が満たすか
  • 全て元の配列を変更しない (非破壊)

filter と find とは

条件に合う要素を抽出するfilterと、最初の一致を見つけるfindを使いこなそう。本レッスンでは、filter と find の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

filter と find

配列から条件に合う要素を抽出するメソッドを学びましょう。

filter:条件に合う全要素を抽出

JavaScript

const numbers = [1, 2, 3, 4, 5, 6]; const evens = numbers.filter(n => n % 2 === 0); // [2, 4, 6]

find:最初の一致要素を返す

JavaScript

const users = [{ name: "太郎", age: 25 }, { name: "花子", age: 30 }]; const found = users.find(u => u.age > 28); // { name: "花子", age: 30 }

some / every

JavaScript

[1, 2, 3].some(n => n > 2); // true(1つでも条件を満たす) [1, 2, 3].every(n => n > 0); // true(全て条件を満たす)

この問題では、商品リストをフィルタリングし、条件判定を組み合わせた分析関数を実装しましょう。

実務で遭遇するパターン

中級レッスンで学んだことが、実際の業務コードでどう登場するかを整理します。

  • 検索結果のフィルタリングproducts.filter(p => p.category === selected)
  • 特定ユーザー検索users.find(u => u.id === id)
  • バリデーションerrors.some(e => e.severity === "critical")
  • 全件チェックitems.every(i => i.completed) で完了確認

コードレビューで指摘されがちなポイント

PR を出すとシニアから入りやすい指摘です。先回りで身につけておけばレビューが一発で通ります。

  • filter(...)[0]find を使うべき、全件走査せず最初の一致で打ち切るため平均的に速い
  • includes で済むのに find ─ 単純な存在確認は includes のほうが意図明確
  • !filter(...).lengthevery!some で書き直し
  • filter チェーンが長すぎ ─ 条件を 1 つの関数にまとめると読みやすい

パフォーマンス考慮事項

  • find は早期終了 ─ 見つかった瞬間に止まる
  • some / every も早期終了 ─ 条件が決まった瞬間に止まる
  • filter は全件走査 ─ 大量データなら Set / Map でインデックス化
  • 配列メソッドは新配列を作る ─ メモリ使用量に注意、巨大データはストリーミング処理
この章のポイント

ここまでの要点 全件抽出は filter、1 件は find、存在確認は some / includes、全件チェックは everyfilter()[0] ではなく find を使う。

よくある質問

Q. filter と find の違いは?

A. filter は条件を満たす要素を全部集めて配列で返し、find は最初に見つかった 1 件だけ返します。1 件だけ欲しいなら find の方が短絡評価で速く、空のとき undefined(Python の next は StopIteration)になる点に注意してください。

Q. filter の戻り値が空配列のときの扱いは?

A. JS の filter は常に配列を返すため、空でも .length で安全にチェックできます。Python の filter はイテレータを返すので list() で囲んでから使うか、内包表記 [x for x in items if cond] の方が分かりやすいことが多いです。

Q. filter と map をチェーンしても性能は大丈夫ですか?

A. 通常規模なら問題ありません。配列を 2 周することになるため、要素数が数百万を超える場合だけ reduce にまとめるか、JS なら array.reduce で 1 周にすることを検討してください。可読性は filter→map のチェーンが分かりやすいです。

次のレッスン

次は reduce で、条件に合う要素を抽出するfilterと、最初の一致を見つけるfindを使いこなそう を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. filter と find の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. filter と find とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

入出力例

test-cases.txt

analyzeProducts([{"name":"りんご","price":200,"stock":5},{"name":"バナナ","price":100,"stock":3},{"name":"メロン","price":15000,"stock":1}], 100, 1000){"allInStock":true,"cheapest":"バナナ","filtered":["りんご","バナナ"],"hasExpensive":true} analyzeProducts([{"name":"A","price":500,"stock":0},{"name":"B","price":300,"stock":2}], 200, 600){"allInStock":false,"cheapest":"B","filtered":["A","B"],"hasExpensive":false} analyzeProducts([{"name":"X","price":100,"stock":1}], 200, 300){"allInStock":true,"cheapest":null,"filtered":[],"hasExpensive":false}
main.js
main.js
学習モード

メモ

filter と find

⌘S で保存