このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

Array.prototype.findIndex()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨2015年9月⁩.

findIndex()Array インスタンスのメソッドで、配列内の指定されたテスト関数に合格する最初の要素のインデックスを返します。 テスト関数に合格する要素がなかった場合は -1 を返します。

find() メソッドも参照してください。こちらのメソッドは、配列内で見つかった要素の位置ではなく、値を返します。

試してみましょう

const array = [5, 12, 8, 130, 44];

const isLargeNumber = (element) => element > 13;

console.log(array.findIndex(isLargeNumber));
// 予想される結果: 3

構文

js
findIndex(callbackFn)
findIndex(callbackFn, thisArg)

引数

callbackFn

配列のそれぞれの要素に対して実行する関数です。一致する要素が得られたことを示すには真値を返し、そうでなければ偽値を返してください。この関数は以下の引数で呼び出されます。

element

配列内で現在処理されている要素です。

index

配列内で現在処理されている要素のインデックス(位置)です。

array

findIndex() を呼び出した元の配列です。

thisArg 省略可

callbackFn 内で this として使われるオブジェクトです。反復処理メソッドを参照してください。

返値

テストに合格した配列の要素の位置を返します。それ以外の場合は、 -1 を返します。

解説

findIndex() メソッドは反復処理メソッドです。配列の要素のそれぞれに対して、インデックスの昇順に一度ずつ callbackFn 関数を実行し、callbackFn 関数が真値を返すまで繰り返します。 findIndex() はその要素を返し、配列の反復処理を停止します。もし callbackFn が真値を返さない場合、 findIndex()-1 を返します。これらのメソッドが一般的にどのように動作するのかについての詳細は、反復処理メソッドの節をご覧ください。

callbackFn は、値が割り当てられているものに限らず、配列中のすべてのインデックスに対して呼び出されます。疎配列では、空のスロットは undefined と同じ動作をします。

findIndex() メソッドは汎用的です。これは this 値に length プロパティと整数キーのプロパティがあることだけを期待します。

配列内の最初の素数の位置を検索する

次の例では、配列の中で素数の入った最初の要素の位置を返し、素数が見つからなかった場合は -1 を返します。

js
function isPrime(n) {
  if (n < 2) {
    return false;
  }
  if (n % 2 === 0) {
    return n === 2;
  }
  for (let factor = 3; factor * factor <= n; factor += 2) {
    if (n % 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)

メモ: isPrime() の実装は、説明のみを目的としています。実際のアプリケーションでは、繰り返し計算を避けるために、エラトステネスの篩などの、高度に最適化されたアルゴリズムを使用することをお勧めします。

callbackFn の第 3 引数の使用

array 引数は、配列内の別の要素にアクセスする場合、特に、その配列を参照する既存の変数がない場合に便利です。次の例では、最初に filter() を使用して正の値を抽出し、次に findIndex() を使用して、その値よりも小さい最初の要素を探します。

js
const numbers = [3, -1, 1, 4, 1, 5, 9, 2, 6];
const firstTrough = numbers
  .filter((num) => num > 0)
  .findIndex((num, idx, arr) => {
    // arr 引数がない場合、変数に保存せずに中間配列に簡単に
    // アクセスする方法はありません。
    if (idx > 0 && num >= arr[idx - 1]) return false;
    if (idx < arr.length - 1 && num >= arr[idx + 1]) return false;
    return true;
  });
console.log(firstTrough); // 1

疎配列における findIndex() の使用

疎配列で undefined を検索することで、空スロットのインデックスを取得することができます。

js
console.log([1, , 3].findIndex((x) => x === undefined)); // 1

配列でないオブジェクトに対する findIndex() の呼び出し

findIndex() メソッドは thislength プロパティを読み込み、そのキーが length よりも小さい非負の整数である各プロパティにアクセスします。

js
const arrayLike = {
  length: 3,
  "-1": 0.1, // -1 < 0 なので findIndex() 空は無視される
  0: 2,
  1: 7.3,
  2: 4,
};
console.log(
  Array.prototype.findIndex.call(arrayLike, (x) => !Number.isInteger(x)),
); // 1

仕様書

Specification
ECMAScript® 2026 Language Specification
# sec-array.prototype.findindex

ブラウザーの互換性

関連情報