【ふぃるたーかんすう】

filter関数 とは?

💡 条件に合う要素だけを「ふるいにかけて」選び出す
📌 このページのポイント
filter関数の動き 元の配列 1 8 3 12 2 7 条件: x >= 5 5以上の要素だけ通す 結果 8 12 7 コード例(JavaScript) const nums = [1,8,3,12,2,7] const result = nums .filter( x => x >= 5 ) // [8, 12, 7] 元の配列は変更されない (非破壊的操作)
filter関数のイメージ
ひよこ ひよこ

filter関数ってどう使うの?

ペンギン先生 ペンギン先生

たとえばユーザーの配列から20歳以上だけを取り出したいとき、「users.filter(u => u.age >= 20)」と書くだけ。条件関数がtrueを返した要素だけが集められて、新しい配列として返ってくるんだ。for文でif文を書いてpushするより圧倒的にスッキリするよ。

ひよこ ひよこ

mapとfilterの違いは何?

ペンギン先生 ペンギン先生

mapは「全要素を変換する」、filterは「条件で絞り込む」という違いだよ。mapは必ず元と同じ数の配列が返るけど、filterは条件に合った分だけ少なくなる。よくあるのは「filterで絞り込んでからmapで変換する」という組み合わせで、メソッドチェーンで繋げて書けるんだ。

ひよこ ひよこ

filter関数で気をつけることってある?

ペンギン先生 ペンギン先生

大量のデータに複雑な条件でfilterをかけるとパフォーマンスに影響が出ることがあるよ。10万件の配列にfilterを3回チェーンすると、毎回全件走査するからね。そういうときはfor文で1回のループにまとめたほうが速い。あとfilterの条件関数の中で副作用(外の変数を書き換えるなど)を起こすのは避けるべき。意図しないバグの温床になるよ。

ひよこ ひよこ

SQLのWHERE句とfilter関数って同じようなもの?

ペンギン先生 ペンギン先生

考え方は同じだよ。WHERE句はDBレベルでデータを絞り込み、filter関数はアプリケーションのメモリ上で絞り込む。大量データの場合はDBのWHEREで先に絞り込んでからアプリに渡すほうが圧倒的に効率がいい。全件取得してからfilterで絞り込むのはアンチパターンだよ。

ひよこ ひよこ

TypeScriptのfilterで型を絞り込めるって聞いたけど?

ペンギン先生 ペンギン先生

Type Guardを使ったfilterだね。配列に string | null が混在しているとき、arr.filter((x): x is string => x !== null) と書くと、戻り値の型が string[] に推論される。普通のfilterだと (string | null)[] のままだから、型安全なコードを書くときにすごく便利なテクニックだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「filter関数」って出てきたら「配列から条件に合う要素だけを取り出して新しい配列を作る関数だな」と思えればだいたいOK!
📖 おまけ:英語の意味
「filter」 = ろ過する・選別する
💬 コーヒーフィルターのように、条件に合うものだけを通すイメージだよ
← 用語集にもどる