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

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

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

構文

arr.some(callback[, thisArg])

引数

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

返り値

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

説明

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

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

some()thisObject パラメータが与えられると、callback の this として使用されます。それ以外は、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 の定義
ドラフト  

ブラウザ互換性

Kangax's compat tablesに基づく。

機能 Firefox (Gecko) Chrome Internet Explorer Opera Safari
基本サポート (有) (有) 9 (有) (有)
機能 Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
基本サポート ? ? ? ? ?

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: sii, teoli, ethertank, Potappo, Shoot
 最終更新者: sii,