Array.prototype.some()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

some()Array インスタンスのメソッドで、指定された関数で実装されているテストに、配列の中の少なくとも 1 つの要素が合格するかどうかを判定します。配列の中で指定された関数が true を返す要素を見つけた場合は true を返し、そうでない場合は false を返します。配列は変更しません。

試してみましょう

構文

js
some(callbackFn)
some(callbackFn, thisArg)

引数

callbackFn

配列のそれぞれの要素に対して実行する関数です。この関数は、要素がテストに合格したことを示すには真値を、そうでない場合は偽値を返します。この関数は以下の引数で呼び出されます。

element

配列内で処理中の現在の要素です。

index

配列内で処理中の現在の要素のインデックスです。

array

some() が呼び出された配列です。

thisArg 省略可

callbackFn を実行する際に this として使用される値。反復処理メソッドを参照してください。

返値

配列の要素のいずれかで callbackFn真値を返した場合は、直ちに true を返します。それ以外の場合は false です。

解説

some() メソッドは反復処理メソッドです。指定された callbackFn 関数を配列の各要素に対して一度ずつ、 callbackFn真値を返すまで呼び出します。該当する要素が見つかった場合は、 some() は直ちに true を返し、配列の反復処理を中止します。一方、 callbackFn がすべての要素に対して偽値を返した場合、 some()false を返します。

some() は数学の量化子 "there exists" のような働きをします。特に、空配列の場合、どのような条件でも false を返します。

callbackFn は値が割り当てられている配列インデックスに対してのみ呼び出されます。疎配列の空のスロットに対しては呼び出されません。

some() は呼び出し元の配列を変更しませんが、 callbackFn として指定された関数は配列を変更することができます。ただし、配列の長さは callbackFn を最初に呼び出す前に保存されることに注意してください。したがって、

  • callbackFn は、 some() の呼び出しを始めたときの配列の長さを超えて追加された要素にはアクセスしません。
  • 既に処理したインデックスを変更しても、 callbackFn が再度呼び出されることはありません。
  • まだ処理していない既存の配列要素が callbackFn によって変更された場合、callbackFn に渡される値はその要素が取得された時点での値になります。削除された要素は処理されません。

警告: 上記のように進行中の配列に対して変更を行うと、理解しにくいコードになることが多いので、(特別な場合を除いて)避けるのが一般的です。

some() メソッドは汎用的です。これは this 値に length プロパティと整数キーのプロパティがあることだけを期待します。

配列要素の値のテスト

次の例は、配列のいずれかの要素に 10 よりも大きいものがあるかどうかをテストします。

js
function isBiggerThan10(element, index, array) {
  return element > 10;
}

[2, 5, 8, 1, 4].some(isBiggerThan10); // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true

アロー関数を使った配列要素のテスト

アロー関数は、より短い構文で同じテストを提供します。

js
[2, 5, 8, 1, 4].some((x) => x > 10); // false
[12, 5, 8, 1, 4].some((x) => x > 10); // true

ある値が配列に存在するかどうかのチェック

includes() メソッドを真似て、このカスタム関数は配列にその要素が存在する場合に true を返します。

js
const fruits = ["apple", "banana", "mango", "guava"];

function checkAvailability(arr, val) {
  return arr.some((arrVal) => val === arrVal);
}

checkAvailability(fruits, "kela"); // false
checkAvailability(fruits, "banana"); // true

任意の値の論理値への変換

js
const TRUTHY_VALUES = [true, "true", 1];

function getBoolean(value) {
  if (typeof value === "string") {
    value = value.toLowerCase().trim();
  }

  return TRUTHY_VALUES.some((t) => t === value);
}

getBoolean(false); // false
getBoolean("false"); // false
getBoolean(1); // true
getBoolean("true"); // true

疎配列に対する some() の使用

some() は空のスロットでは処理を実行しません。

js
console.log([1, , 3].some((x) => x === undefined)); // false
console.log([1, , 1].some((x) => x !== 1)); // false
console.log([1, undefined, 1].some((x) => x !== 1)); // true

配列以外のオブジェクトに対する some() の呼び出し

some() メソッドは thislength プロパティを読み込み、キーが length より小さい非負の整数である各プロパティに、すべてアクセスするか callbackFntrue を返すまでアクセスします。

js
const arrayLike = {
  length: 3,
  0: "a",
  1: "b",
  2: "c",
  3: 3, // length が 3 .なので some() 空は無視される
};
console.log(Array.prototype.some.call(arrayLike, (x) => typeof x === "number"));
// false

仕様書

Specification
ECMAScript Language Specification
# sec-array.prototype.some

ブラウザーの互換性

BCD tables only load in the browser

関連情報