[JavaScript/TypeScript]リストに含まれる/含まれないをチェックする(some, every, includes)

はじめに

JavaScriptやTypeScriptでは、配列内に特定の値が含まれているかどうかを判定する処理は非常に頻繁に登場します。フォーム入力の検証、権限リストのチェック、タグのフィルタリングなど、あらゆる場面で「要素が含まれているか/含まれていないか」を判断することが求められます。

本記事では、そのような含有判定をシンプルかつ明確に実装するための基本的な関数として、includes、some、every の3つを取り上げます。これらを適切に使い分けることで、条件式の可読性を高め、意図を正確に表現することが可能になります。

また、実務でよく発生する判定パターンを体系的に整理し、それぞれに最適な実装方法を紹介します。配列操作の理解を深め、堅牢で読みやすいコードを書くための一助となれば幸いです。

本記事内のサンプルコードはすべてJavaScriptで記述しています。TypeScriptを利用する場合も、基本的な構文や挙動は同様です。

含有判定の基本

配列に特定の要素が含まれているかどうかを判断するためには、まずJavaScript/TypeScriptにおける配列操作の基本的な考え方を理解しておく必要があります。含有判定は単純な値比較にとどまらず、条件式の設計や意図の明確化にも関わるため、正しい関数選択が重要です。

この章では、まず配列操作の基本概念を確認したうえで、含有判定において特に使用頻度の高い3つの関数 — includessomeevery — の特徴と使い分けについて整理します。

JavaScript/TypeScriptにおける配列操作の基本概念

JavaScriptおよびTypeScriptでは、配列(Array)は順序付きのデータ集合を扱うための基本的なデータ構造です。配列は数値や文字列といったプリミティブ値だけでなく、オブジェクトや関数など任意の型の要素を格納できます。

配列は0から始まるインデックスでアクセスされ、length プロパティによって要素数を取得できます。たとえば次のように操作します。

const fruits = ["apple", "banana", "orange"];
console.log(fruits[0]); // "apple"
console.log(fruits.length); // 3

配列を操作する方法は多岐にわたりますが、大きく分けて次の2つの目的で使い分けられます。

  1. 要素を取得・加工する
    例:mapfilterreducefind など
    → 配列の内容を変換したり、特定の要素を抽出したりする際に利用します
  2. 条件を判定する
    例:includessomeevery など
    → 配列が特定の条件を満たすかどうかを真偽値(true/false)で返す場合に利用します

特に本記事のテーマである「含有判定」は、後者の条件判定系メソッドに分類されます。これらのメソッドは、ループ処理を自動的に内部で実行するため、従来の for 文や forEach に比べてコードを短く、かつ意図を明確に記述できる点が大きな利点です。

次節では、含有判定で中心的に利用される3つの関数 — includessomeevery — の特徴と基本的な使い方を解説します。

判定処理でよく使われる3つの関数(includes/some/every)

配列内の要素が特定の条件を満たすかどうかを確認する際、JavaScript/TypeScriptでは主に includessomeevery の3つのメソッドが利用されます。これらはいずれも真偽値を返す判定メソッドであり、コードの意図を簡潔かつ明確に表現できる点が特徴です。

以下では、それぞれの概要と基本的な違いを整理します。

includes:値の存在を直接判定する

includes は、配列内に特定の値が含まれているかどうかを単純に確認するためのメソッドです。プリミティブ型の比較に適しており、=== による厳密等価で比較を行います。

const fruits = ["apple", "banana", "orange"];
fruits.includes("banana"); // true
fruits.includes("grape");  // false

オブジェクトや関数など参照型を比較する場合は、同一インスタンスでなければ一致しません。そのため、条件付きの判定が必要な場合は someevery を用います。

some:条件を満たす要素が「1つでも」あるか判定する

some は、コールバック関数を用いて任意の条件を満たす要素が1つでも存在するかを確認します。条件式を柔軟に指定できるため、オブジェクト配列などに対しても有効です。

const users = [
  { id: 1, active: false },
  { id: 2, active: true }
];

users.some(u => u.active); // true

1つでも条件を満たせば true を返し、全ての要素が不一致の場合のみ false となります。

every:全ての要素が条件を満たすか判定する

every は、配列内のすべての要素が条件を満たしているかを確認します。

1つでも条件を満たさない要素があると、false が返されます。

const scores = [80, 90, 100];
scores.every(s => s >= 70); // true
scores.every(s => s >= 90); // false

some と対を成す関係であり、「一部が一致する」か「すべてが一致する」かの違いで使い分けます。

まとめ

メソッド判定対象条件指定戻り値主な用途
includes値の一致不可(固定比較)真偽値単純な値比較
some任意の条件可能真偽値条件を満たす要素があるか
every任意の条件可能真偽値すべての要素が条件を満たすか

これら3つの関数を正しく使い分けることで、配列内の含有判定を明確かつ意図通りに記述できます。

次章では、これらを用いて実務で頻出する判定パターンを体系的に整理します。

判定パターンの整理

配列の含有判定は、一見すると単純な処理に見えますが、実際の業務ロジックでは「どの要素が」「どのように」含まれているかを厳密に区別する必要があります。たとえば「特定の1要素が存在する」ケースと「候補群のうちいずれかが含まれる」ケースでは、意図する判定条件が異なり、使用すべきメソッドの選択も変わります。

本章では、まず「チェック対象の数」と「含み方」の観点から判定の分類を整理し、その上で実務上よく登場する5つの基本パターンを体系的にまとめます。これにより、要件に応じた関数選択と条件設計を一貫して行えるようになります。

チェック対象数と含み方の分類

配列の含有判定を整理する際は、まず「チェック対象の数」「含み方(条件の満たし方)」の2軸で分類すると明確になります。この2つを組み合わせることで、すべての含有パターンを体系的に整理できます。

チェック対象の数

判定したい対象が単一か複数かによって、使用するメソッドやロジックの構造が変わります。

種類説明典型的な用途使用例
単一要素チェック対象が1つだけの場合IDやタグの存在確認などarr.includes(value)
複数要素候補群のいずれか/すべてを確認する場合権限リスト、フィルタ条件、カテゴリー選択などtargets.some(...) / targets.every(...)

単一要素であれば includes で十分ですが、複数要素を扱う場合は someevery と組み合わせることで柔軟な条件判定が可能になります。

含み方(条件の満たし方)

対象が配列内に「どのように」含まれているかという観点です。

主に次の4種類に分類できます。

種類意味対応メソッド構成
いずれかを含む候補のうち1つでも含まれていればよいsome + includes
すべてを含むすべての候補が含まれている必要があるevery + includes
いずれかを含まない少なくとも1つは含まれないsome + !includes
すべてを含まないどれも含まれていないevery + !includes

これらを「チェック対象の数」と組み合わせることで、実務で必要な含有判定ロジックをほぼ網羅できます。

次節では、この分類をもとに、現場で頻出する5つの代表的なパターンを整理します。

実務で頻出する5つの組み合わせ

前節で整理した「チェック対象数」と「含み方」を組み合わせると、理論上はさまざまなパターンが考えられます。しかし、実務において頻繁に登場するのは次の5つの組み合わせにほぼ限定されます。

いずれも日常的な開発シーンで登場する明確な意図を持ったパターンです。

ある要素を含む

単一の値が配列に存在するかを判定する、最も基本的なケースです。フォーム入力の検証、ユーザーIDの存在確認など、頻出する単純チェックに使用します。

const fruits = ["apple", "banana", "orange"];

// 単純な値の存在確認
console.log(fruits.includes("banana")); // true
console.log(fruits.includes("grape"));  // false

includesは要素をループして探し、引数の要素が存在しているかを===で比較して真偽値で返します。比較は===で行われるため、型が異なると一致しない点に注意が必要です。

いずれかの要素を含む

複数候補のうち、少なくとも1つでも含まれていればよいケースです。特定の権限を1つでも持っていれば許可、特定のタグを1つでも持っていれば対象、といった条件に用います。

const fruits = ["apple", "banana", "orange"];
const targets = ["grape", "banana", "melon"];

// 候補のうち1つでも含まれていれば true
const hasAny = targets.some(t => fruits.includes(t));

console.log(hasAny); // true

someは「1つでも条件を満たす要素があるか」を返すメソッドで、includesと組み合わせることで「候補のいずれかが存在するか」を簡潔に表現できます。

すべての要素を含む

複数候補すべてが配列内に含まれている必要があるケースです。要求条件をすべて満たしているか、特定の属性群をすべて保持しているかを確認する際に利用されます。

const fruits = ["apple", "banana", "orange"];
const required = ["banana", "orange"];

// 候補すべてが含まれていれば true
const hasAll = required.every(r => fruits.includes(r));

console.log(hasAll); // true

everyは「すべての要素が条件を満たすか」を返すメソッドで、includesと組み合わせることで「完全に含まれるか」を簡潔に表現できます。候補のうち、1つでも含まれない要素がある場合はfalseを返します。

いずれかの要素を含まない

候補群の中で少なくとも1つが配列に含まれていない場合に検出したいケースです。設定漏れや未登録要素の検知など、例外的状況の判定に使われます。

const fruits = ["apple", "banana", "orange"];
const required = ["banana", "melon"];

// 候補のうち1つでも含まれていなければ true
const missingAny = required.some(r => !fruits.includes(r));

console.log(missingAny); // true

someは前述のとおり「1つでも条件を満たす要素があるか」を返すメソッドであるため、!includes(含まれていない)と組み合わせることで「どれかが欠けているか」を確認することができます。このことから「完全一致ではない」や「要素が不足している」ことをチェックするのに有効です。

すべての要素を含まない

候補群のいずれも配列に存在しないことを確認するケースです。除外条件やフィルタ処理、禁止リストなどに多く用いられます。

const fruits = ["apple", "banana", "orange"];
const excluded = ["grape", "melon"];

// 候補のすべてが含まれていなければ true
const hasNone = excluded.every(e => !fruits.includes(e));

console.log(hasNone); // true

everyは前述のとおり「すべての要素が条件を満たすか」を返すメソッドであるため、!includes(含まれていない)と組み合わせることで「全く含まれない」を確認することができます。このことから1つも入っていないことをチェックする除外リストやブラックリストの判定などに有効です。


これら5パターンを体系的に理解しておくことで、条件式を意図通りに設計できるだけでなく、コードレビュー時にもロジックの誤読を防ぐことができます。

おわりに

配列の含有判定は、日常的な開発で頻出する基本的な処理の一つですが、要件の解釈次第で適切な実装方法は大きく変わります。includessomeevery の3つのメソッドを正しく使い分けることで、冗長なループ処理を避け、コードの意図を明確に表現することが可能になります。特に本記事で整理した5つのパターンを理解しておくと、配列に対する条件判定を一貫性をもって設計でき、後続の保守やレビューでも誤解を防ぐことができます。

小さなユーティリティの選択が、最終的にはシステム全体の可読性と信頼性につながる点を意識するとよいでしょう。今後さらに複雑なデータ構造を扱う場面でも、ここで紹介した原則は有効です。

まずは「何を、どのように含むのか」を明確にし、意図に最も適したメソッドを選ぶことが重要です。

モバイルバージョンを終了