2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

every() が true でも「データが全件合格」とは限らない — 空配列・穴・asyncの確認

2
Posted at

items.every(check) が true なら送信可能、とするコード。データがそもそも届いていなくても、その判定を通ることがあります。every は「1件以上あること」まで保証しません。

今回は、Node.js v24.14.1で返り値とコールバックの実行回数を確認しました(2026-10-17)。目的は性能比較ではなく、検査していないデータを「全件合格」と扱わないための条件整理です。

空配列では、検査関数が0回でもtrue

let calls = 0;
const passed = [].every(score => {
  calls++;
  return score >= 60;
});
console.log(passed, calls); // true 0

80点と90点なら true / 2回、80点と50点なら false / 2回、空配列では true / 0回 でした。空の配列そのものをifに渡したときのtruthy判定とは別です。ここでは every というメソッドが、真偽値の true を返しています。

「条件に反する要素が見つからなければtrue」という理解なら、検査対象が0件でも矛盾しません。しかし、アプリの要件が「1件以上選び、全件が合格」なら、そのまま使うには条件が足りません。

const scores = [];
const canSubmit =
  scores.length > 0 && scores.every(score => score >= 60);
console.log(canSubmit); // false

なお、「違反がない」という要件なら空配列のtrueが適切なこともあります。常に空配列を禁止する必要はなく、0件をどう扱うかを別に決めます。

lengthだけでは、穴のある配列を防げない

const scores = new Array(3);
let calls = 0;
const passed = scores.every(score => {
  calls++;
  return score >= 60;
});
console.log(scores.length, passed, calls); // 3 true 0

長さ3でも、各位置に値が入っているわけではありません。every は穴を飛ばすので、ここでも検査は0回でした。length > 0 を付け足しても、この例は通ります。

手元で通常のJSON配列を受け取るケースと、自分で new Array(n) を使って組み立てるケースは区別できます。穴も不正扱いしたいなら、値を埋めた配列に変えて検査する方法があります。

const scores = new Array(3);
const dense = Array.from(scores);
const passed = dense.length > 0 && dense.every(score =>
  Number.isFinite(score) && score >= 60
);
console.log(passed); // false

この例では、穴が undefined となり、有限の数値かどうかで落ちます。文字列の "80" を合格にしたい仕様なら、数値への変換方法を別に決めてください。

every(async ...) は完了を待たない

const scores = [80, 50];
const passed = scores.every(async score => score >= 60);
console.log(passed); // true

非同期関数の返り値はPromiseです。Promiseオブジェクトはtrue相当なので、解決後の false はこの判定に使われません。

const scores = [80, 50];
const results = await Promise.all(
  scores.map(async score => score >= 60)
);
const passed = results.length > 0 && results.every(Boolean);
console.log(passed); // false

この書き方は、値が入った通常の配列を前提にしています。穴も入力されうるなら、Array.from などで整えてから、各値の検証を行います。また、処理が失敗してPromiseがrejectされた場合の扱いは、合格・不合格の判定と別に必要です。

否定のsomeでも、比較の条件には注意

!scores.some(score => score < 60) も、空配列ならtrueです。さらに、点数が undefined の場合、undefined < 60 はfalseになるため「不合格は一つもない」に入ってしまいます。一方、every(score => score >= 60) はこの値にfalseを返します。

「60点未満がない」と「全て60点以上」は、入力に数値以外が入ると同じ式ではありません。AIが条件を短く書き換えたときも、空・不正な値・非同期処理を分けて確認すると、差が見えます。

参考: ECMAScript仕様のevery、MDNのevery解説


未経験者向けの講座を運営しています

未経験から Next.js + Supabase + Claude Code で Webアプリを公開するまで を、全24セッションで体系化した教材です。

※ 中上級者には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?