この翻訳は不完全です。英語から この記事を翻訳 してください。

findIndex() メソッドは、配列内の要素が指定されたテスト関数を満たす場合、配列内の インデックス を返します。そうでない場合は -1 を返します。

find() メソッドも参照してください。このメソッドは、配列内で見つかった要素のインデックスではなく、 を返します。

構文

arr.findIndex(callback[, thisArg])

引数

callback
配列内の各要素に対して実行する関数です。3 個の引数を取ります:
element
配列内で現在処理されている要素。
indexOptional
配列内で現在処理されている要素のインデックス。
arrayOptional
findIndex を呼び出した元の配列。
thisArgOptional
任意。 callback が実行される時に this として使われるオブジェクト。

戻り値

テストを満たした配列の要素のインデックスを返します。満たさなければ、-1を返します。

説明

findIndex メソッドは、callback 関数が true を返す要素が見つかるまで、配列内の各要素に対して callback 関数を実行します。そのような要素が見つかると、findIndex はすぐにその要素のインデックスを返します。配列内に見つからなければ、find-1 を返します。callback 関数は、値が割り当てられた配列のインデックスに対してのみ実行されます。 削除されたものや割り当てられていないインデックスに対しては実行されません。

callback は、要素の値、要素のインデックス、検索される Array オブジェクトの 3 個の引数で呼び出されます。

findIndexthisArg 引数を与えた場合、各 callback の呼び出し時に、その与えたオブジェクトが、this として使用されます。この引数を省略した場合、thisundefined になります。

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

 

arrow functionを使用してインデックスを検索する

次の例では、アロー関数を使用してフルーツのインデックスを求めています。

const fruits = ["apple", "banana", "cantaloupe", "blueberries", "grapefruit"];

const index = fruits.findIndex(fruit => fruit === "blueberries");

console.log(index); // 3
console.log(fruits[index]); // blueberries

 

互換コード

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;
  };
}

If you need to support truly obsolete JavaScript engines that don't support Object.defineProperty, it's best not to polyfill Array.prototype methods at all, as you can't make them non-enumerable.

仕様

仕様 状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Array.prototype.findIndex の定義
標準 Initial definition.
ECMAScript Latest Draft (ECMA-262)
Array.prototype.findIndex の定義
ドラフト  

ブラウザ実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応45 あり25 なし328
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応 あり あり あり4 あり8 あり

1. From version 0.12: this feature is behind the --harmony runtime flag.

関連情報

ドキュメントのタグと貢献者

このページの貢献者: isdh, Marsf, shide55
最終更新者: isdh,