some() メソッドは、配列の少なくとも 1 つの要素が、渡された関数によって実施されるテストに通るかどうかをテストします。
注: このメソッドは空の配列ではあらゆる条件式に対して false を返します。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
構文
arr.some(callback[, thisArg])
引数
callback- 各要素に対してテストを実行する関数です。次の 3 つの引数を取ります。
element- 現在処理されている要素です。
indexOptional- 現在処理されている要素のインデックスです。
arrayOptionalsome()が実行されている配列です。
thisArgOptionalcallbackを実行するときにthisとして使用するオブジェクトです。
返り値
コールバック関数がいずれかの配列要素で truthy 値を返した場合は true です。それ以外は false です。
説明
some() は、与えられた callback 関数を、配列に含まれる各要素に対して一度ずつ、callback が真の値(Boolean に変換した際に真となる値)を返す要素が見つかるまで呼び出します。真の値を返す要素が見つかると、some() はただちに true を返します。見つからなかった場合、some() は false を返します。callback は値が代入されている配列のインデックスに対してのみ呼び出されます。つまり、すでに削除されたインデックスや、まだ値が代入されていないインデックスに対しては呼び出されません。
callback は、要素の値、要素のインデックス、走査されている Array オブジェクトという 3 つの引数をともなって呼び出されます。
some() に thisArg パラメータが与えられると、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 版で指示されたアルゴリズムと全く同じものです。Object、TypeError はそれぞれオリジナルの値を持ち、またそれらの fun.call は Function.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 の定義 |
ドラフト |
ブラウザー互換性
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
some | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1.5 | IE 完全対応 9 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 ≤37 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応