条件検索とは何か
配列の「条件検索」は、要素の値やプロパティが“指定した条件を満たす”ものを探すことです。ここが重要です:何を返したいかで使うメソッドが変わります。要素そのものが欲しいなら find、位置が欲しいなら findIndex、“複数全部”なら filter、“1つでもあるか”の判定なら some、“全部満たすか”なら every。破壊的操作は含まれず、どれも非破壊で安全です。
目的別の選び方(要素/位置/個数/存在)
最初の一致“要素”が欲しい(find)
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ここが重要です:見つからなければ undefined。1件だけ欲しいときの最短手です。
最初の一致“位置”が欲しい(findIndex)
const users = [{id:1},{id:2}];
const i = users.findIndex(u => u.id === 2);
if (i >= 0) users[i] = { ...users[i], name: "B2" }; // 位置ベース更新
JavaScriptここが重要です:見つからなければ -1。削除や挿入など“位置を使う操作”に向いています。
条件を満たす“全部”が欲しい(filter)
const products = [
{ name: "A", stock: 0, price: 100 },
{ name: "B", stock: 5, price: 200 },
{ name: "C", stock: 3, price: 150 }
];
const inStockCheap = products.filter(p => p.stock > 0 && p.price <= 180);
// [{ name: "C", stock: 3, price: 150 }]
JavaScriptここが重要です:複数件の抽出に最適。結果は新しい配列です。
存在判定だけ欲しい(some/every)
const nums = [2, 4, 6];
nums.some(n => n > 5); // true(1つでも超える)
nums.every(n => n % 2 === 0); // true(全部偶数)
JavaScriptここが重要です:true/false の一問一答。重い条件は“軽い前置き”で絞ると効率的です。
条件の書き方の基本(読みやすさと安全性)
単純なプロパティ一致
const order = orders.find(o => o.id === targetId);
JavaScript- 型一致: “2” と 2 は別。比較前に型を揃える。
- 存在チェック: 見つからない可能性に備え、undefined を扱う分岐を必ず用意。
複合条件(AND/OR)
const pick = products.find(p => p.stock > 0 && (p.price <= 180 || p.onSale));
JavaScript- 優先順位: () で明示。可読性を上げる。
- 短絡評価: 左側が決まれば右側は評価されない。重い条件は後ろへ。
範囲条件・境界
const okTemps = temps.filter(t => t >= 0 && t <= 50);
JavaScript- 含む/含まない: どちらの境界かを明示(<= / <)。
文字列検索(部分一致・大小無視)
const q = "tokyo";
const hit = cities.find(c => c.name.toLowerCase().includes(q.toLowerCase()));
JavaScript- 正規化: toLowerCase や trim で形式を揃えてから比較。
- 部分一致: 配列の includes は“完全一致”。部分一致は文字列の includes を使う。
ネスト・関連配列の条件
const order = orders.find(o => o.items.some(name => name === "note"));
JavaScript- 組み合わせ: some/every と組み合わせると表現力が上がる。
例題で身につける条件検索レシピ
1件取得:優先度の高い在庫
const products = [
{ name: "A", stock: 0, priority: 2 },
{ name: "B", stock: 3, priority: 3 },
{ name: "C", stock: 2, priority: 1 }
];
const best = products
.filter(p => p.stock > 0)
.sort((a, b) => b.priority - a.priority)[0] ?? undefined;
console.log(best); // { name: "B", stock: 3, priority: 3 }
JavaScriptここが重要です:絞る→並べる→先頭取得。sort は破壊的なので、元を守るなら const sorted = [...arr].sort(...) とコピーしてから。
位置ベース更新:ID を見つけて差し替え
const users = [{id:1,name:"A"}, {id:2,name:"B"}];
const i = users.findIndex(u => u.id === 2);
if (i >= 0) users[i] = { ...users[i], name: "B2" };
JavaScriptここが重要です:-1 チェックを徹底。スプレッドで非破壊的に要素を置き換える。
条件抽出:タグを持つ記事だけ
const articles = [
{ title: "X", tags: ["js", "web"] },
{ title: "Y", tags: ["db"] }
];
const jsArticles = articles.filter(a => a.tags.includes("js"));
JavaScriptここが重要です:ネスト配列は includes/some と相性が良い。
実在判定:必須権限を全部持っているか
const userPerms = ["read", "write", "export"];
const required = ["read", "write"];
const ok = required.every(p => userPerms.includes(p)); // true
JavaScriptここが重要です:“全件一致”の検証は every が最短。
失敗しないための注意点(重要項目の深掘り)
undefined と空スロット(疎配列)の違い
const a = [undefined]; // 値として undefined(0 in a → true)
const b = Array(1); // 空スロット(0 in b → false)
JavaScript- コールバックの呼ばれ方: forEach/map/filter は空スロットをスキップ。意図せず“穴”が残ることがある。
- 安全な正規化: Array.from(arr, x => x ?? null) で穴を埋めてから検索すると安定。
-1 と undefined の扱い
- findIndex: 見つからなければ -1。必ず
i >= 0を条件に。 - find: 見つからなければ undefined。
if (!hit)だけに頼らず、必要ならhit === undefinedを明示。
NaN と比較の罠
[NaN].includes(NaN); // true
[NaN].indexOf(NaN); // -1(見つからない)
JavaScript- 数値検証: Number.isNaN/Number.isFinite を使い、曖昧比較を避ける。
破壊的操作の混在
- sort/splice: 配列を直接変える。検索結果に続けて使うなら“コピーしてから”が安全。
const sorted = [...arr].sort((a,b) => a-b);
JavaScript高コスト条件の最適化
- 短絡評価を活かす: 軽い前置き(型・範囲)→重い判定(正規表現・外部参照)の順に書く。
- 繰り返し判定: 許可集合は Set 化して O(1) 判定。
const allow = new Set(["png","jpg","gif"]);
allow.has("png"); // true
JavaScriptまとめ
条件検索は「何を返したいか」でメソッドを選ぶのが最重要です。1件は find、位置は findIndex、複数は filter、存在判定は some/every。条件は型を揃え、複合は () で明示、文字列は正規化してから比較。疎配列をスキップする挙動、-1/undefined の扱い、NaN の特性、破壊的操作の混在には特に注意。短絡評価と非破壊更新(スプレッド+slice)を習慣にすれば、初心者でも“意図通りで壊れにくい”検索ロジックを短く正確に書けます。

