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

JavaScript JavaScript
スポンサーリンク

every とは何か

every は「配列の全ての要素が、与えた条件を満たすか」を true/false で返す判定メソッドです。1つでも条件を満たさない要素が見つかった瞬間に false を返し、探索を打ち切ります(短絡評価)。ここが重要です:every は“全件一致”のチェックで、成功なら true、失敗なら false。要素やインデックスは返しません。


基本の使い方(コールバックで条件を定義)

全てが条件を満たすかの判定

const nums = [2, 4, 6];
const allEven = nums.every(n => n % 2 === 0);
console.log(allEven); // true(全部偶数)
JavaScript

全件が条件に合っているかを一発で確認できます。途中で不一致を見つければ即座に false を返して終了します。

一部が不一致なら false

const xs = [2, 3, 4];
console.log(xs.every(n => n % 2 === 0)); // false(3 が偶数ではない)
JavaScript

ここが重要です:1つでも条件を満たさない要素があれば失敗。不一致を早く検知できるため効率的です。

空配列は常に true

console.log([].every(() => false)); // true
JavaScript

ここが重要です:「全てが満たす」命題の空事(vacuous truth)として、対象が空なら true。意図しない通過を防ぐには、必要なら事前に空チェックを加えます。


コールバックの引数と thisArg

value・index・array が渡される

const arr = [5, 10, 15];
const ok = arr.every((value, index, array) => {
  // value: 今の要素
  // index: その位置
  // array: 元の配列(必要なら参照)
  return value >= 5 && index < array.length;
});
console.log(ok); // true
JavaScript

位置条件や配列全体に基づく判定も書けます。判定は“純粋”(副作用なし)に保つと安全です。

thisArg で文脈を渡す(必要なときだけ)

const cfg = { min: 10 };
const arr = [10, 12, 18];
const ok = arr.every(function (x) { return x >= this.min; }, cfg);
console.log(ok); // true
JavaScript

通常は外部変数を直接参照(クロージャ)で十分です。this を使う設計なら thisArg が役立ちます。


some と every の関係(使い分けの軸)

“1つでも” vs “全て”

  • some は「少なくとも1つが条件を満たすか」。
  • every は「全てが条件を満たすか」。

ここが重要です:OR 条件の存在判定は some、AND 条件の一括検証は every。両者は対になる概念で、短絡評価を活かして効率的に判定します。

否定との組み合わせで表現力を上げる

const xs = [2, 4, 6];
const noneOdd = xs.every(n => n % 2 === 0);    // 奇数が“1つもない”
const noneOdd2 = !xs.some(n => n % 2 !== 0);   // same(対になる関係)
JavaScript

ここが重要です:ロジックを“どちら側から言うか”で可読性が変わります。意図が伝わる方を選びましょう。


実践例(入力検証・権限チェック・データ品質)

入力検証:全てが許可拡張子か

const allow = ["png", "jpg", "gif"];
function allAllowed(files) {
  return files.every(f => allow.includes(f.split(".").pop()?.toLowerCase()));
}
console.log(allAllowed(["a.png", "b.jpg"])); // true
console.log(allAllowed(["a.png", "tool.exe"])); // false
JavaScript

全ファイルがホワイトリストに含まれるかの一括検証に向いています。

権限チェック:必要条件を全部満たしているか

const userPerms = ["read", "write", "export"];
const required = ["read", "write"];
const ok = required.every(p => userPerms.includes(p));
console.log(ok); // true
JavaScript

必須権限を“全て”持っているか。依存の整合性チェックにも使えます。

データ品質:数値が全て範囲内か

const temps = [18, 22, 25];
const ok = temps.every(t => t >= 0 && t <= 50);
console.log(ok); // true
JavaScript

境界チェックをまとめて行う際にシンプルです。


パフォーマンスと挙動の要点

短絡評価で効率化できる

every は先頭から評価し、false が出た瞬間に終了します。ここが重要です:高コストの判定があるなら、軽い前置き(型・範囲の簡易チェック)を先に置くとムダが減ります。

配列は変更しない(非破壊)

every は元配列を変えません。ここが重要です:状態管理や参照共有でも安心。判定に副作用を持たせないのが基本です。

NaN と比較の注意

const xs = [1, NaN, 3];
const ok = xs.every(Number.isFinite); // false(NaN は有限でない)
JavaScript

判定関数で適切な比較・型チェックを選ぶと、意図が明確になりバグを防げます。


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

「空配列は true」を知らずに、検証をすり抜けるバグが起きます。必要なら事前に空チェックを追加します。要素やインデックスが欲しいのに every を使うと情報が得られません。最初の不一致の“位置”が必要なら findIndex(不一致を探すロジック)や reduce で集計します。判定関数に副作用(外部状態の書き換え)を入れると、途中終了で一貫性を崩しやすいです。関数は“純粋”に保ち、必要な更新は判定と切り離します。高コストの処理を全要素に行うと非効率になるため、前処理で正規化(小文字化・型変換)してから every を使うと良いです。


まとめ

every は「配列の全要素が条件を満たすか」を非破壊・短絡評価で判定するメソッドです。空配列は true、1つでも不一致があれば false。OR 条件の some と対になり、入力検証・権限チェック・品質保証に最適です。要素や位置が必要なら find/findIndex を選ぶ。空配列の扱い、純粋な判定関数、前置きの軽量チェックを意識すれば、初心者でも“全件一致の検証”を短く正確に書けます。

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