Array.prototype.some()

some() メソッドは、配列の少なくとも 1 つの要素が、渡された関数によって実施されるテストに通るかどうかをテストします。

: このメソッドは空の配列ではあらゆる条件式に対して false を返します。

構文

arr.some(callback[, thisArg])

引数

callback
各要素に対してテストを実行する関数です。次の 3 つの引数を取ります。
element
現在処理されている要素です。
indexOptional
現在処理されている要素のインデックスです。
arrayOptional
some() が実行されている配列です。
thisArgOptional
callback を実行するときに this として使用するオブジェクトです。

返り値

コールバック関数がいずれかの配列要素で truthy 値を返した場合は true です。それ以外は false です。

説明

some() は、与えられた callback 関数を、配列に含まれる各要素に対して一度ずつ、callback が真の値(Boolean に変換した際に真となる値)を返す要素が見つかるまで呼び出します。真の値を返す要素が見つかると、some() はただちに true を返します。見つからなかった場合、some()false を返します。callback は値が代入されている配列のインデックスに対してのみ呼び出されます。つまり、すでに削除されたインデックスや、まだ値が代入されていないインデックスに対しては呼び出されません。

callback は、要素の値、要素のインデックス、走査されている Array オブジェクトという 3 つの引数をともなって呼び出されます。

some()thisArg パラメータが与えられると、callbackthis として使用されます。それ以外は、undefined 値が this として使用されるでしょう。callback が最終的に監視できる this の値は、関数から見た this の決定に関する一般的なルールによって決定されます。

some() は呼び出された配列を変化させません。

some() によって処理される要素の範囲は、callback が最初に呼び出される前に設定されます。some() の呼び出しが開始された後に追加された要素に対しては、callback は実行されません。既存の配列要素が変更されたり、削除された場合、callback に渡される値は some() がそれらを訪れた時点での値になり、some() が削除された要素を訪問することはありません。

配列要素の値をテストする

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

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

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

配列要素をアロー関数を使ってテストする

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

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

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

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

var fruits = ['apple', 'banana', 'mango', 'guava'];

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

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

ある値が存在するかどうかをアロー関数を使ってチェックする

var fruits = ['apple', 'banana', 'mango', 'guava'];

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

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

任意の値を Boolean に変換する

var TRUTHY_VALUES = [true, 'true', 1];

function getBoolean(value) {
  'use strict';
   
  if (typeof value === 'string') { 
    value = value.toLowerCase().trim();
  }

  return TRUTHY_VALUES.some(function(t) {
    return t === value;
  });
}

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

Polyfill

some() は ECMA-262 標準の第 5 版に追加されたメソッドなので、すべての版の標準には存在しない場合があります。次のコードをスクリプトの先頭に追加することにより some() がネイティブでサポートされていない実装上でも some() が使用可能となります。このアルゴリズムは ECMA-262 第 5 版で指示されたアルゴリズムと全く同じものです。ObjectTypeError はそれぞれオリジナルの値を持ち、またそれらの fun.callFunction.prototype.call のオリジナルの値として評価されます。

// Production steps of ECMA-262, Edition 5, 15.4.4.17
// Reference: http://es5.github.io/#x15.4.4.17
if (!Array.prototype.some) {
  Array.prototype.some = function(fun, thisArg) {
    'use strict';

    if (this == null) {
      throw new TypeError('Array.prototype.some called on null or undefined');
    }

    if (typeof fun !== 'function') {
      throw new TypeError();
    }

    var t = Object(this);
    var len = t.length >>> 0;

    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++) {
      if (i in t && fun.call(thisArg, t[i], i, t)) {
        return true;
      }
    }

    return false;
  };
}

仕様

仕様 状況 コメント
ECMAScript 5.1 (ECMA-262)
Array.prototype.some の定義
標準 初回の定義。JavaScript 1.6 で実装。
ECMAScript 2015 (6th Edition, ECMA-262)
Array.prototype.some の定義
標準  
ECMAScript Latest Draft (ECMA-262)
Array.prototype.some の定義
ドラフト  

ブラウザー互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
someChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1.5IE 完全対応 9Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 ≤37Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 1.0nodejs 完全対応 あり

凡例

完全対応  
完全対応

関連情報