JavaScript | 配列・オブジェクト:配列の検索・判定 – includes

JavaScript JavaScript
スポンサーリンク

includes とは何か

includes は「配列の中に、指定した値が“存在するかどうか”を true/false で返す」判定メソッドです。位置は返さず、単純に“あるかないか”だけを答えます。ここが重要です:includes は厳密等価に近い比較で判定し、NaN を正しく検出できます(indexOf は NaN を見つけられません)。配列に値が含まれるかの一問一答が目的なら、まず includes を選ぶのが自然です。


基本の使い方と戻り値

値の存在を判定する

const a = ["pen", "book", "note"];
console.log(a.includes("book")); // true
console.log(a.includes("pencil")); // false
JavaScript

true/false の返り値がそのまま条件分岐に使えます。位置は不要で「あるかどうか」だけ知りたい処理に最適です。

先頭以外から探す(fromIndex)

const a = ["A", "B", "A", "C"];
console.log(a.includes("A"));       // true(先頭から)
console.log(a.includes("A", 2));    // true(インデックス2以降に "A" がある)
console.log(a.includes("B", 2));    // false(2以降には "B" がない)
JavaScript

第二引数 fromIndex は「この位置から後ろを探す」開始位置です。重複がある場合に“後ろ側に存在するか”を判定できます。

負の開始位置(末尾からの相対)

const a = ["A", "B", "A", "C"];
console.log(a.includes("A", -2)); // true(最後から2の位置=インデックス2以降に "A")
JavaScript

負の fromIndex は「末尾から数えた相対位置」を起点に前方へ向かって検索します。計算結果が 0 未満なら 0 に切り上げられ、先頭からの検索になります。


比較の性質(=== に近いが NaN を検出できる)

型が違うと一致しない

const nums = [1, 2, 3];
console.log(nums.includes("2")); // false("2" は文字列、2 は数値)
JavaScript

型も比較されます。検索対象の型を意図通りに揃えてから判定してください。

NaN を正しく検出できる

console.log([NaN].includes(NaN)); // true
JavaScript

indexOf は NaN を見つけられませんが、includes は見つけられます。数値計算の異常値混入チェックなどで有用です。

オブジェクトや配列は“同じ参照”だけ一致

const obj = { id: 1 };
const a = [obj, { id: 1 }];
console.log(a.includes(obj));        // true(同じ参照)
console.log(a.includes({ id: 1 }));  // false(別インスタンス)
JavaScript

中身が同じでも別インスタンスは一致しません。プロパティ条件で探したい場合は findIndex や some を使います。


文字列・大文字小文字・部分一致の注意

文字列の大文字小文字は区別される

const tags = ["JS", "web"];
console.log(tags.includes("js")); // false(大小区別あり)
JavaScript

大小を無視したいなら、事前に同じケースへ正規化します。

const q = "js";
const norm = tags.map(t => t.toLowerCase());
console.log(norm.includes(q.toLowerCase())); // true
JavaScript

部分一致はしない(完全一致のみ)

const a = ["hello", "world"];
console.log(a.includes("wor")); // false(部分一致ではない)
JavaScript

部分一致をしたいなら、some と includes(文字列の)を組み合わせます。

const hasSub = a.some(s => s.includes("wor")); // true
JavaScript

関連メソッドとの使い分け

indexOf/lastIndexOf との違い

位置が欲しいなら indexOf(最初)や lastIndexOf(最後)を使います。単に存在チェックなら includes の方が意図が明確で、NaN にも対応します。

findIndex/some との違い

プロパティや複合条件で「存在判定」したいなら some(true/false)、位置が必要なら findIndex(番号/見つからなければ -1)。値そのものの一致なら includes が最短です。

const users = [{id:1},{id:2}];
console.log(users.some(u => u.id === 2)); // true(条件で存在判定)
console.log(users.findIndex(u => u.id === 2)); // 1(位置が欲しい)
JavaScript

実践例(重複防止・ホワイトリスト判定・入力検証)

重複を防いで追加する(非破壊)

const tags = ["js", "web"];
const next = tags.includes("ux") ? tags : [...tags, "ux"];
// ["js","web","ux"]
JavaScript

存在判定で分岐すれば、重複追加を避けられます。UIの差分検知とも相性が良い非破壊パターンです。

許可された値だけ通す(ホワイトリスト)

const allow = ["png", "jpg", "gif"];
function isAllowed(ext) {
  return allow.includes(ext.toLowerCase());
}
JavaScript

入力検証で「許される集合に含まれるか」を簡潔に表現できます。大小を揃えるとミスが減ります。

トグル追加(あるなら外し、無ければ足す)

function toggle(arr, value) {
  return arr.includes(value)
    ? arr.filter(x => x !== value)
    : [...arr, value];
}
JavaScript

存在判定を軸に“追加か削除か”を決める UI でよく使うパターンです。


よくある落とし穴と回避策

「部分一致」を期待して includes を使うと false になります。配列の includes は“完全一致”です。部分一致は some と文字列の includes を組み合わせてください。型違い(”2″ と 2)で false になるのは仕様です。検索前に型を正すか、用途に応じて変換を挟みます。オブジェクトは参照比較のため、同内容でも別インスタンスは false。条件判定なら some/findIndex を使います。fromIndex の負値は「末尾からの相対開始」ですが、計算結果が 0 未満なら 0 に切り上げられます。意図した範囲で判定できているかを確認しましょう。


まとめ

includes は「配列に値が含まれるか」を即座に判定する真っ直ぐなメソッドで、true/false を返します。型は厳密に比較され、NaN を正しく検出できます。位置が不要な存在チェックでは indexOf より明快で、重複防止やホワイトリスト判定、トグル追加などに最適です。部分一致や条件検索が目的なら some/findIndex を選ぶ。比較の性質(型、参照、大小)と fromIndex の挙動を理解すれば、初心者でも意図通りで安全な判定ロジックを短く書けます。

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