Array.prototype.findIndex()
findIndex()
メソッドは、配列内の指定されたテスト関数に合格する最初の要素の位置を返します。テスト関数に合格する要素がない場合を含め、それ以外の場合は -1
を返します。
試してみましょう
find()
メソッドも参照してください。このメソッドは、配列内で見つかった要素の位置ではなく、値を返します。
構文
// アロー関数
findIndex((element) => { /* … */ } )
findIndex((element, index) => { /* … */ } )
findIndex((element, index, array) => { /* … */ } )
// コールバック関数
findIndex(callbackFn)
findIndex(callbackFn, thisArg)
// インラインコールバック関数
findIndex(function(element) { /* … */ })
findIndex(function(element, index) { /* … */ })
findIndex(function(element, index, array){ /* … */ })
findIndex(function(element, index, array) { /* … */ }, thisArg)
引数
callbackFn
-
配列内のそれぞれの値に対して実行される関数で、条件を満たす要素が発見されたことを示す
true
が返るまで続けられます。この関数は以下の引数と共に呼び出されます。
element
-
配列内で現在処理されている要素。
index
-
配列内で現在処理されている要素の位置。
array
-
findIndex()
を呼び出した元の配列。
コールバックは適切な要素が見つかったときに、真値を返す必要があります。 この要素の位置が
findIndex()
から返されます。 thisArg
省略可-
任意で、
callbackFn
を実行する時にthis
として使うオブジェクト。
返値
テストに合格した配列の要素の位置を返します。それ以外の場合は、 -1
を返します。
解説
findIndex()
メソッドは、配列のそれぞれの位置に対して callbackFn
を 1 回ずつ呼び出し、 callbackFn
が真値を返すものを見つけるまで繰り返します。
そのような要素が見つかったら、 findIndex()
はすぐにその要素の位置を返します。 callbackFn
が真値を返すものがなかった場合(または配列の length
が 0
であった場合)、 findIndex()
は -1
を返します。
メモ: some()
などの他の配列メソッドとは異なり、 callbackFn
は値が割り当てられていない位置でも実行されます。
callbackFn
は 3 つの引数で呼び出されます。
- その要素の値
- その要素の位置
- 走査されている配列オブジェクト
thisArg
引数を findIndex()
に与えた場合、それぞれの callbackFn
の呼び出し時に、その与えたオブジェクトが this
として使用されます。この引数を省略した場合は undefined
になります。
findIndex()
で処理される要素の範囲は、 callbackFn
が最初に呼び出される前に設定されます。既に処理済みの位置に割り当てられた要素や、その範囲を超えた要素に対しては、 callbackFn
が実行されません。 callbackFn
は最初の findIndex()
の呼び出し以降に配列に追加された要素は処理しません。配列内で未処理の既存の要素が callbackFn
によって変更された場合、 callbackFn
へ渡される値は findIndex()
がその要素の位置を処理する時点での値になります。削除された値も処理対象になります。
警告: 前項で説明したような、参照中の配列の同時進行での変更は(特殊な場合を除いて)普通は避けるべきです。多くの場合、理解しにくいコードになります。
例
配列内の素数の位置を検索する
次の例では、配列の中で素数の入った最初の要素の位置を返し、素数が見つからなかった場合は -1
を返します。
function isPrime(element) {
if (element % 2 === 0 || element < 2) {
return false;
}
for (let factor = 3; factor <= Math.sqrt(element); factor += 2) {
if (element % factor === 0) {
return false;
}
}
return true;
}
console.log([4, 6, 8, 9, 12].findIndex(isPrime)); // -1, not found
console.log([4, 6, 7, 9, 12].findIndex(isPrime)); // 2 (array[2] is 7)
アロー関数を使用して位置を検索する
次の例では、アロー関数を使用してフルーツの位置を検索しています。
const fruits = ["apple", "banana", "cantaloupe", "blueberries", "grapefruit"];
const index = fruits.findIndex((fruit) => fruit === "blueberries");
console.log(index); // 3
console.log(fruits[index]); // blueberries
仕様書
Specification |
---|
ECMAScript Language Specification # sec-array.prototype.findindex |
ブラウザーの互換性
BCD tables only load in the browser