find とは何か
find は「配列から、条件を満たす“最初の1要素”を返す」検索メソッドです。見つかればその要素、見つからなければ null ではなく undefined を返します。ここが重要です:find は“値そのもの”の一致ではなく、“関数で定義した条件”で探します。オブジェクトのプロパティ一致や複合条件に強く、indexOf/includes では扱いづらい検索を自然に書けます。
基本の使い方(コールバック関数で条件を定義)
最初に一致した要素を返す
const users = [
{ id: 1, name: "A" },
{ id: 2, name: "B" },
{ id: 3, name: "B" }
];
const hit = users.find(u => u.name === "B");
console.log(hit); // { id: 2, name: "B" }(最初の一致だけ)
JavaScriptここが重要です:一致が複数あっても“最初の1件”のみ。全部集めたいときは filter を使います。
見つからない場合(undefined に注意)
const xs = [10, 20, 30];
const hit = xs.find(x => x > 100);
console.log(hit); // undefined(条件を満たす要素なし)
JavaScriptここが重要です:undefined を返すため、if (hit === undefined) の判定が安全です。0 や “” は“有効な値”になり得るので falsy 判定だけに頼らないでください。
コールバックに渡される引数(書きやすく、誤りにくく)
値・インデックス・配列全体が取れる
const arr = [5, 12, 8];
const hit = arr.find((value, index, array) => {
// value: 今見ている値
// index: その位置
// array: 元の配列(必要なら参照)
return value % 4 === 0 && index > 0;
});
console.log(hit); // 8
JavaScriptここが重要です:インデックスや配列も参照できるので、位置条件や前後関係を含む検索が書けます。
thisArg で外部コンテキストを使う(必要なときだけ)
const threshold = { limit: 50 };
const arr = [10, 60, 40];
const hit = arr.find(function (x) { return x > this.limit; }, threshold);
console.log(hit); // 60
JavaScriptここが重要です:第二引数 thisArg でコールバック内の this を指定できます。通常はクロージャ(直接変数を参照)で十分です。
indexOf/includes と find の違い(目的に応じた選び分け)
値そのもの vs 条件
- indexOf/includes は“値そのものの一致”を調べます。
- find は“関数で定義した条件”で探します。
ここが重要です:オブジェクトのプロパティ一致、範囲条件、複合条件などは find が最短です。位置が欲しいなら findIndex を選びます。
位置が必要なら findIndex
const users = [{id:1},{id:2}];
const idx = users.findIndex(u => u.id === 2);
console.log(idx); // 1(見つからなければ -1)
JavaScriptここが重要です:find は“要素”を返し、findIndex は“位置”を返します。目的に合わせて使い分けましょう。
実践パターン(1件取得の定番レシピ)
ID で1件取得(見つかったら使う、なければ分岐)
const users = [{id:1},{id:2},{id:3}];
const user = users.find(u => u.id === 2);
if (user) {
// 見つかった要素を使う
} else {
// 404 的な扱い・フォールバック
}
JavaScriptここが重要です:存在しないケースを必ず考慮する。undefined の扱いを明確にするとバグが減ります。
優先ルールで選ぶ(複合条件)
const products = [
{ name: "A", stock: 0, price: 100 },
{ name: "B", stock: 5, price: 200 },
{ name: "C", stock: 3, price: 150 }
];
const pick = products.find(p => p.stock > 0 && p.price <= 180);
console.log(pick); // { name: "C", ... }
JavaScriptここが重要です:複数条件を素直に書けるのが find の強み。読みやすい論理式で“最初の適合”を取ります。
入れ子や関連配列を使った検索
const orders = [
{ id: 1, items: ["pen", "note"] },
{ id: 2, items: ["book"] }
];
const order = orders.find(o => o.items.includes("note"));
console.log(order); // id:1 の注文
JavaScriptここが重要です:他メソッド(includes など)と組み合わせると、実用的な検索が短く書けます。
パフォーマンス・挙動の要点(誤解しないために)
最初に見つかったら即停止(短絡評価)
find は先頭から順に評価し、条件を満たした瞬間に探索を止めます。ここが重要です:高コストの条件式は“可能性が高い簡易チェック”を前段に置くと効率が上がります。
配列を変更しない(非破壊)
find は元配列を変更しません。ここが重要です:状態管理や共有参照でも安全。必要に応じて返ってきた要素を複製(スプレッド)して扱うと副作用を避けられます。
const user = users.find(u => u.id === 2);
const safe = user ? { ...user } : undefined; // 要素をコピーしてから編集
“全部欲しい”なら filter
find は1件だけ。ここが重要です:複数を取りたいなら filter、統計なら reduce、要素変換なら map を選びます。
よくある落とし穴と回避策
undefined を null と誤認
find が返す“見つからない”は undefined。等価比較の混乱を避けるため、明示的に hit === undefined で判定するか、if (!hit) と書く場合は 0 や “” を返す設計にしないよう注意します。
オブジェクトを直接書き換えて副作用
見つけた要素をそのまま編集すると、元配列の要素(同じ参照)を変更します。必要なら複製({ …obj })してから編集しましょう。
高コスト条件を無駄に評価
重い処理(正規表現の複雑なテスト、外部参照)を毎要素で実行すると遅くなります。先に軽い条件でふるいにかける、前処理で索引化するなどの工夫を。
まとめ
find は「条件で定義した最初の一致を“要素そのもの”として返す」非破壊の検索メソッドです。見つからなければ undefined。値そのものの一致は indexOf/includes、位置が欲しいなら findIndex、複数が欲しいなら filter と使い分けます。コールバックで値・インデックス・配列を扱え、複合条件やプロパティ一致に強い。短絡評価と非破壊の特性を理解し、undefined の扱い・副作用回避(要素の複製)・条件の効率化を意識すれば、初心者でも“意図通りで安全な1件検索”をシンプルに書けます。
