JavaScriptのeveryは、配列の全要素が条件を満たすかを確認したい場面で非常に便利なメソッドです。ですが、someとの違いがあいまいだったり、空配列の扱いで戸惑ったり、returnの書き方で期待通りに動かないことも少なくありません。
この記事では、JavaScriptのeveryの使い方を基礎から整理し、構文、戻り値、実務で役立つ具体例、注意点まで順番に解説します。
初学者の方はもちろん、あらためて正確に理解し直したい方にも役立つ内容です。読み終えるころには、everyを安全かつ自然に使いこなせるようになります。
JavaScriptのeveryの使い方を基本から理解する
JavaScriptのeveryは、配列に含まれるすべての要素が指定した条件を満たしているかを判定するための配列メソッドです。戻り値は真偽値で、全要素が条件を満たせばtrue、ひとつでも満たさなければfalseになります。
単純なループでも同じ処理は書けますが、everyを使うことで意図が明確になり、条件判定のコードを短く読みやすくまとめやすくなります。
入力チェック、権限確認、数値配列の検証など、実務でも利用場面は多く、配列操作を学ぶうえで優先的に押さえておきたいメソッドのひとつです。
everyの役割は、全件が条件を満たすかをひと目で表現できることです。
条件に合わない要素が見つかった時点で処理を打ち切るため、無駄な判定を減らしやすい点もメリットです。
everyの基本構文と戻り値
基本構文は、配列に対してeveryを呼び出し、その引数にコールバック関数を渡す形です。コールバック関数の中で各要素に対する条件式を書き、その結果がすべてtrueならevery全体もtrueになります。
たとえば、すべての値が10以上かを調べたいなら、各要素に対して10以上かどうかを返せばよいという考え方です。条件式を書く場所が明確なので、配列全体のルールを簡潔に表現できます。
また、戻り値は新しい配列ではなくtrueかfalseです。そのため、mapやfilterのような変換処理とは役割が異なる点を理解しておくことが重要です。
const result = numbers.every(num => num >= 10);
この場合、numbersの全要素が10以上ならtrueになります。
コールバック関数に渡される引数
everyのコールバック関数には、主に3つの引数を受け取れます。1つ目は現在の要素、2つ目は現在のインデックス、3つ目は元の配列です。普段は要素だけ使えば十分ですが、インデックスや配列全体が必要になる場面もあります。
たとえば、配列の順序まで確認したい場合や、前後関係を見ながら判定したい場合にインデックスが役立ちます。また、元の配列にアクセスしたいケースでは3つ目の引数が便利です。
ただし、引数を増やしすぎると可読性が下がるため、必要なものだけ受け取るのが基本です。シンプルな条件判定なら、要素だけを使う書き方がもっとも読みやすくなります。
| 引数 | 内容 |
|---|---|
| 第1引数 | 現在の要素 |
| 第2引数 | 現在のインデックス |
| 第3引数 | 元の配列 |
for文ではなくeveryを使うメリット
for文でも全件判定は可能ですが、everyを使うと処理の目的が明確になります。for文では、ループ、条件分岐、途中終了の制御を自分で書く必要があります。一方でeveryは、全要素が条件を満たすかという目的そのものがメソッド名に表れているため、読む側にも意図が伝わりやすいです。
また、条件に合わない要素が見つかった時点で自動的に処理が止まるため、効率面でも扱いやすいです。特に配列操作に慣れた開発現場では、宣言的な書き方が好まれることが多く、保守性の面でもメリットがあります。
ただし、複雑な副作用を伴う処理や細かな制御が必要な場合は、for文のほうが向くこともあります。everyは判定専用として使うと最も効果的です。
JavaScriptのeveryを実例で学ぶ使い方
everyは文法だけ覚えても、実際の使いどころが分からなければ定着しません。ここでは、数値判定、文字列チェック、オブジェクト配列の検証といった代表的な場面を通して、使い方を具体的に整理します。
重要なのは、各要素に対して同じ条件を当てはめ、全件が合格かどうかを見るという発想です。1件でも条件を満たさないものがあればfalseになるため、フォーム入力の検証やデータ品質チェックにも向いています。
実例を通して理解すると、everyをどのタイミングで選ぶべきかが見えやすくなります。
数値配列が条件を満たすか確認する例
もっとも基本的な例は、数値配列の全要素が一定の条件を満たすかを確認する使い方です。たとえば、全員の点数が合格点以上か、すべての価格が0以上か、すべての値が整数かといった確認ができます。
このような判定は、データ処理の前段階で不正値をはじく用途に向いています。everyを使えば、各値を個別に確認する処理を簡潔にまとめられます。
数値配列では比較演算子との相性がよく、コードの意味も読み取りやすいため、everyの練習として最初に試す題材に適しています。
const scores = [70, 82, 90];
const passed = scores.every(score => score >= 60);
この場合は全員が60点以上なので、passedはtrueになります。
文字列配列や入力値チェックに使う例
everyは文字列の検証にも便利です。たとえば、すべての入力欄が空文字ではないか、配列内の文字列が一定文字数以上か、不要な空白を含まないかといった確認に使えます。
フォーム送信前のバリデーションでは、複数の入力値をまとめて確認したい場面が多いため、everyの活躍機会は少なくありません。trimを組み合わせれば、見た目は入力されていても実質空欄というケースも判定できます。
ただし、単に1つでも条件を満たすかを確認したい場面ではsomeのほうが自然です。全件必須の確認にeveryを使うと、意図がすっきり伝わります。
オブジェクト配列を検証する実務的な例
実務では、配列の中身がオブジェクトであるケースが非常に多いです。たとえば、ユーザー一覧の全員にメールアドレスがあるか、商品データの全件に価格が設定されているか、タスクの全件に完了フラグがあるかといった確認に使えます。
オブジェクト配列に対してeveryを使うと、各要素の特定プロパティをまとめて検証できます。これにより、APIから取得したデータが想定どおりかを事前にチェックしやすくなります。
条件式が長くなる場合は、補助関数に切り出すと可読性が上がります。everyは短く書ける反面、条件が複雑すぎると読みづらくなるため、整理して使う意識が大切です。
JavaScriptのeveryと他の配列メソッドの違い
everyを正しく使いこなすには、似た用途のメソッドとの違いを理解することが欠かせません。特に比較されやすいのはsome、filter、findです。どれも配列を対象に条件式を使いますが、返す結果と目的は大きく異なります。
メソッド選びを誤ると、意図が伝わりにくくなったり、不要に複雑な処理になったりします。everyは全件判定、someは一部判定、filterは絞り込み、findは最初の1件取得という役割を押さえておくと整理しやすいです。
用途ごとの違いを把握すれば、コードの読みやすさと保守性が大きく向上します。
everyとsomeの違い
everyとsomeは対になるような関係にあります。everyはすべての要素が条件を満たすかを確認し、someはひとつでも条件を満たす要素があるかを確認します。どちらも戻り値はtrueかfalseですが、意味は正反対です。
たとえば、全員が成人かを確認するならevery、成人が1人でもいるかを確認するならsomeが自然です。条件式が同じでも、選ぶメソッドによってコードの意味が変わります。
迷ったときは、確認したい内容を日本語で考えると判断しやすいです。全員か、誰かひとりでもか、この違いを意識するだけで選択ミスはかなり減らせます。
| メソッド | 判定内容 | 戻り値 |
|---|---|---|
| every | 全要素が条件を満たすか | true または false |
| some | 1つでも条件を満たすか | true または false |
everyとfilterやfindの違い
filterは条件に合う要素をすべて取り出して新しい配列を返し、findは条件に合う最初の1件を返します。一方でeveryは、条件に合うかどうかの真偽値だけを返します。つまり、要素を取り出したいのか、判定したいだけなのかで選ぶべきメソッドが変わります。
もし全件が有効かを確かめたいだけならeveryが最も適しています。filterで条件に合う要素数を数えて比較する方法もありますが、意図が遠回りになりやすいです。
メソッドは書けるかどうかより、目的に合っているかが重要です。判定だけならevery、抽出ならfilterやfindと使い分けるのが基本です。
JavaScriptのeveryを使うときの注意点とよくある失敗
everyは便利な反面、挙動を正確に知らないと意外な結果になることがあります。特に空配列でtrueが返る点、コールバック内でreturnを書き忘れる点、非同期処理には向かない点はよくあるつまずきです。
これらは初学者だけでなく、久しぶりにJavaScriptを書く場合にも起こりやすい注意点です。正しい使い方を理解しておけば、バグの予防につながります。
実務で安全に使うには、期待する戻り値と処理の流れをあらかじめ明確にしておくことが大切です。
空配列に対してtrueが返る理由
everyは、空配列に対して実行するとtrueを返します。これは一見不自然に感じますが、全要素が条件を満たすかという定義に照らすと、反例が1つも存在しないためtrueになるという考え方です。
この挙動は仕様に沿ったものですが、入力チェックでは意図とずれる場合があります。たとえば、項目が1件以上あることも同時に確認したいなら、配列の長さもあわせて判定する必要があります。
空配列を許可したくない場面では、everyだけに頼らず、件数条件を組み合わせることが重要です。ここを見落とすと、データがないのに検証成功と判断してしまう恐れがあります。
returnの書き忘れとアロー関数の注意
everyのコールバックで波かっこを使う場合、明示的にreturnを書く必要があります。これを忘れるとundefinedが返り、条件を満たしていない扱いになって期待した結果になりません。
一方、式をそのまま返す短いアロー関数ならreturnは省略できます。たとえば、num => num > 0 のような書き方です。短い条件ならこちらのほうが見やすいことが多いです。
ただし、処理を複数行に分けるときは省略できないため、書き方を混同しないように注意が必要です。everyが正しく動かないときは、まずreturnの有無を確認すると原因を見つけやすいです。
非同期処理との相性に注意する
everyは同期的に真偽値を返すメソッドであり、非同期関数との組み合わせには注意が必要です。コールバック内でasyncを使っても、期待通りに各Promiseの完了を待ってくれるわけではありません。
そのため、非同期の検証を全件に対して行いたい場合は、Promiseを配列化してから一括で待機し、その後に判定する設計が必要です。everyはあくまで同期条件の全件判定に向いていると理解しておくべきです。
実務では、同期判定と非同期判定を混同しないことが大切です。使い分けを誤ると、バグが見つけにくくなるため、処理の性質に応じて適切な方法を選びましょう。
よくある確認ポイント
- 空配列でもtrueになることを理解しているか
- 波かっこを使ったコールバックでreturnを書いているか
- 非同期処理をeveryでそのまま扱おうとしていないか
まとめ
JavaScriptのeveryは、配列の全要素が条件を満たすかを簡潔に判定できる便利なメソッドです。基本構文はシンプルですが、戻り値が真偽値であること、someやfilterとは役割が異なること、空配列ではtrueになることなど、正確に理解して使うことが大切です。
特に実務では、入力値チェックやオブジェクト配列の検証などで活躍します。条件が明確な全件判定なら、for文よりも意図が伝わりやすく、保守しやすいコードになりやすいです。
迷ったときは、全員が条件を満たすかを確認したいのかを基準に考えてみてください。everyの特性を押さえれば、JavaScriptの配列処理をより正確かつ効率的に書けるようになります。
コメント