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

JavaScript JavaScript
スポンサーリンク

some とは何か

some は「配列の中に、条件を満たす要素が“少なくとも1つでもあるか”を true/false で返す」判定メソッドです。見つかった瞬間に検索を止める“短絡評価”を行います。ここが重要です:some は要素そのものや位置は返しません。存在の有無だけを高速に判定したいときに使います。


基本の使い方(条件はコールバック関数で書く)

1つでも条件を満たすかを判定する

const nums = [3, 7, 12];
const hasEven = nums.some(n => n % 2 === 0);
console.log(hasEven); // true(12 が偶数なので true)
JavaScript

戻り値は true/false。偶数が“1つでも”あれば true、ゼロなら false です。判定結果をそのまま if 文に使えます。

見つからなければ false(undefined は返さない)

const xs = [1, 3, 5];
console.log(xs.some(n => n % 2 === 0)); // false(該当なし)
JavaScript

ここが重要です:some は真偽値しか返しません。要素やインデックスが必要なら find や findIndex を選びます。


コールバックに渡される情報と thisArg

value・index・array の3引数が使える

const arr = [5, 12, 8];
const ok = arr.some((value, index, array) => {
  // value: 今の要素
  // index: その位置
  // array: 元の配列
  return value % 4 === 0 && index > 0; // 8 が該当 → true
});
console.log(ok); // true
JavaScript

インデックスや配列全体を参照できるため、位置条件や前後関係を含む判定も自然に書けます。

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

const cfg = { limit: 50 };
const arr = [10, 60, 40];
const over = arr.some(function (x) { return x > this.limit; }, cfg);
console.log(over); // true(60 が閾値超え)
JavaScript

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


短絡評価(見つかったら即停止)を活かす

高コスト判定は“軽い前置き”で絞る

const files = ["a.txt", "b.log", "big.data"];
const exists = files.some(name => {
  if (!name.endsWith(".data")) return false; // 軽いチェックで足切り
  return name.length > 3;                     // 重い判定は必要時だけ
});
JavaScript

ここが重要です:some は先頭から順に評価し、true が出た瞬間に終了します。軽い条件を前段に置くと無駄な計算を減らせます。

空配列は常に false

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

対象が空なら“該当要素がない”ため false になります。


関連メソッドとの使い分け(目的で選ぶ)

includes と some の違い

includes は“値そのものが含まれるか”を判定します。プロパティや複合条件など“条件で存在判定”したいなら some が適切です。

const users = [{id:1},{id:2}];
console.log(users.some(u => u.id === 2)); // true(条件で判定)
JavaScript

find/findIndex と some の違い

find は“最初の一致要素”、findIndex は“位置”を返します。some は“あるかどうかだけ”。要素や位置が必要なら find/findIndex を選びます。

every との違い(全件一致 vs 1件でも一致)

every は「全てが条件を満たすか」を判定します。some は「1つでも満たすか」。両者は対になる概念です。

const xs = [2, 4, 6];
console.log(xs.every(n => n % 2 === 0)); // true(全部偶数)
console.log(xs.some(n => n % 2 !== 0));  // false(奇数は1つもない)
JavaScript

実践例(検証・アクセス制御・UIトグル)

入力検証(禁止拡張子が含まれていないか)

const banned = ["exe", "bat", "cmd"];
function hasBanned(files) {
  return files.some(f => banned.includes(f.split(".").pop()?.toLowerCase()));
}
console.log(hasBanned(["a.png", "tool.exe"])); // true
JavaScript

禁止リストに“1つでも”該当すれば true。安全な早期判定ができます。

権限チェック(少なくとも1権限が必要)

const userPerms = ["read", "write"];
const required = ["admin", "write"];
const allowed = required.some(p => userPerms.includes(p));
console.log(allowed); // true(write を持っている)
JavaScript

いずれかの権限があれば通す、といった OR 条件で威力を発揮します。

選択のトグル操作(存在で分岐)

function toggle(arr, value) {
  return arr.some(x => x === value)
    ? arr.filter(x => x !== value)   // あるなら外す
    : [...arr, value];               // 無ければ足す
}
JavaScript

some を軸に“追加か削除か”を分岐すると読みやすい UI ロジックになります(非破壊更新)。


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

条件で“値そのものの一致”を期待して some を使うと、不要に複雑になります。単純な値一致は includes が最短です。要素や位置が欲しいのに some を使うと情報が得られません。その場合は find や findIndex を選びます。コールバックが副作用(外部状態の書き換え)を持つと、途中終了のタイミングで一貫性を崩すことがあります。判定関数は“純粋(副作用なし)”に保つのが基本です。重い処理を毎要素に行うと遅くなるため、前段の軽いチェックや事前の正規化(小文字化など)で効率化しましょう。


まとめ

some は「配列に条件を満たす要素が“少なくとも1つ”存在するか」を短く安全に判定できるメソッドです。要素や位置は返さず、true/false の一問一答。短絡評価で見つかった瞬間に停止するため効率的で、検証・アクセス制御・トグルなど OR 条件の実装に最適です。値一致なら includes、要素なら find、位置なら findIndex、全件一致なら every。目的に応じた使い分けと“副作用のない判定”を徹底すれば、初心者でも意図通りで読みやすい存在判定を書けます。

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