some() メソッドは、配列の少なくとも一つの要素が、指定された関数で実装されたテストに合格するかどうかをテストします。これは論理値を返します。
構文
arr.some(callback(element[, index[, array]])[, thisArg])
引数
callback-
各要素に対してテストを実行する関数です。次の 3 つの引数を取ります。
element- 現在処理されている要素です。
indexOptional- 現在処理されている要素の添字です。
arrayOptionalsome()が実行されている配列です。
thisArgOptionalcallbackを実行するときにthisとして使用するオブジェクトです。
返値
配列内の少なくとも1つの要素でコールバック関数が真と解釈される値を返した場合は true です。それ以外は false です。
解説
some() は、与えられた callback 関数を、配列に含まれる各要素に対して一度ずつ、callback が真と解釈される値 (論理型に変換した際に真となる値) を返す要素が見つかるまで呼び出します。そのような要素が見つかると、some() はただちに true を返します。見つからなかった場合、some() は false を返します。callback は値が代入されている配列の要素に対してのみ呼び出されます。つまり、すでに削除された要素や、まだ値が代入されていない要素に対しては呼び出されません。
callback は、要素の値、要素の添字、走査されている Array オブジェクトという 3 つの引数を伴って呼び出されます。
thisArg 引数が some() に与えられると、それがコールバックのの this として使用されます。それ以外は、undefined 値が this として使用されるでしょう。 callback が最終的に見ることができる this の値は、関数から見た this の決定に関する一般的なルールによって決定されます。
some() は呼び出された配列を変化させません。
some() によって処理される要素の範囲は、callback が最初に呼び出される前に設定されます。some() の呼び出しが開始された後に追加された要素に対しては、callback は実行されません。既存の配列要素が変更されたり、削除されたりした場合、callback に渡される値は some() がそれらを訪れた時点での値になり、削除された要素を訪問することはありません。
注: このメソッドは空の配列ではあらゆる条件式に対して false を返します。
Polyfill
some() は ECMA-262 標準の第 5 版に追加されたメソッドなので、この標準に準拠したすべての実装に存在するわけではありません。次のコードをスクリプトの先頭に追加することにより 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;
for (var i = 0; i < len; i++) {
if (i in t && fun.call(thisArg, t[i], i, t)) {
return true;
}
}
return false;
};
}
例
配列要素の値のテスト
次の例は、配列のいずれかの要素が 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 を返します。
const 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
アロー関数を使ったある値が存在するかどうかのチェック
const fruits = ['apple', 'banana', 'mango', 'guava'];
function checkAvailability(arr, val) {
return arr.some(arrVal => val === arrVal);
}
checkAvailability(fruits, 'kela'); // false
checkAvailability(fruits, 'banana'); // true
任意の値の Boolean への変換
const 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
仕様書
| 仕様書 |
|---|
| ECMAScript (ECMA-262) Array.prototype.some の定義 |
ブラウザーの互換性
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
some | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1.5 | IE 完全対応 9 | Opera 完全対応 9.5 | Safari 完全対応 3 | WebView Android 完全対応 ≤37 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.1.100 |
凡例
- 完全対応
- 完全対応