findIndex()
メソッドは、配列内の要素が指定されたテスト関数を満たす場合、配列内の インデックス を返します。そうでない場合は -1
を返します。
find()
メソッドも参照してください。このメソッドは、配列内で見つかった要素のインデックスではなく、値 を返します。
構文
arr.findIndex(callback[, thisArg])
引数
callback
- 配列内の各要素に対して実行する関数です。3 個の引数を取ります:
element
- 配列内で現在処理されている要素。
index
- 配列内で現在処理されている要素のインデックス。
array
findIndex
を呼び出した元の配列。
thisArg
- 任意。
callback
が実行される時にthis
として使われるオブジェクト。
説明
findIndex
メソッドは、callback
関数が true を返す要素が見つかるまで、配列内の各要素に対して callback
関数を実行します。そのような要素が見つかると、findIndex
はすぐにその要素のインデックスを返します。配列内に見つからなければ、find
は -1
を返します。callback
関数は、値が割り当てられた配列のインデックスに対してのみ実行されます。 削除されたものや割り当てられていないインデックスに対しては実行されません。
callback
は、要素の値、要素のインデックス、検索される Array オブジェクトの 3 個の引数で呼び出されます。
findIndex
に thisArg
引数を与えた場合、各 callback
の呼び出し時に、その与えたオブジェクトが、this
として使用されます。この引数を省略した場合、this
は undefined
になります。
findIndex
は、呼び出した配列を変更 (mutate) しません。
findIndex
によって処理される要素の範囲は callback
の最初の呼び出し前に設定されます。findIndex
を呼び出した後に追加された配列の要素は、callback
の実行対象になりません。既存のまだ処理されていない配列要素が callback
により変更された場合、それが callback
に渡されると、findIndex
がその要素のインデックスにアクセスした時点の値になります。削除された要素は処理の対象になりません。
例
配列内の素数のインデックスを検索する
次の例は、配列内の素数の要素のインデックスを探します(配列内に素数が見つからない場合は -1 を返します)。
function isPrime(element, index, array) { var start = 2; while (start <= Math.sqrt(element)) { if (element % start++ < 1) { return false; } } return element > 1; } console.log([4, 6, 8, 12].findIndex(isPrime)); // -1, not found console.log([4, 6, 7, 12].findIndex(isPrime)); // 2
互換コード
このメソッドは、ECMAScript 2015 仕様に追加されており、すべての JavaScript 実装環境で使用できるとは限りません。しかし、次のコードスニペットで Array.prototype.findIndex
を使用できます:
if (!Array.prototype.findIndex) { Array.prototype.findIndex = function(predicate) { if (this === null) { throw new TypeError('Array.prototype.findIndex called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return i; } } return -1; }; }
仕様
ブラウザ実装状況
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
基本サポート | 45.0 | 25.0 (25.0) | 未サポート | 未サポート | 7.1 |
機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
基本サポート | 未サポート | 未サポート | 25.0 (25.0) | 未サポート | 未サポート | iOS 8 |