JavaScript | 配列・オブジェクト:配列の検索・判定 – 条件検索の書き方

JavaScript JavaScript
スポンサーリンク

条件検索とは何か

配列の「条件検索」は、要素の値やプロパティが“指定した条件を満たす”ものを探すことです。ここが重要です:何を返したいかで使うメソッドが変わります。要素そのものが欲しいなら 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)を習慣にすれば、初心者でも“意図通りで壊れにくい”検索ロジックを短く正確に書けます。

タイトルとURLをコピーしました