概要

配列中で与えられた要素が見つけられた最後の添字を返します。もし存在しなければ -1 を返します。配列は fromIndex から逆向きに検索されます。

構文

var index = array.lastIndexOf(searchElement[, fromIndex]);

引数

searchElement
検索する配列要素
fromIndex
逆向きに検索し始める添字。デフォルトは配列の長さの値で、つまり配列全体が検索されます。もしこの添字が配列の長さ以上ならば、配列全体が検索されます。負の数の場合、これは配列の終わりからのオフセットとみなされます。この添字が負の数であってもなお、配列は後ろから前に検索されることに注意してください。負の添え字の絶対値が配列の長さを超えた場合、-1 が返され、配列は検索されません。

説明

lastIndexOfsearchElement と配列の要素を 厳密な同値(三重イコール演算子 === で使われるのと同じ方法)を使って比較します。

互換性

lastIndexOf は ECMA-262 第 5 版に追加されたメソッドであり、他のバージョンの標準実装には存在しない場合があります。次のコードをスクリプトの先頭に追加することにより、lastIndexOf がネイティブでサポートされていない環境でも、これを使用する事が可能となります。これは ECMA-262 第 5 版で定められたアルゴリズムと全く同じものです。
ObjectTypeErrorNumberMath.floorMath.absMath.min が、それぞれオリジナルの値を持つ事を仮定しています。

if (!Array.prototype.lastIndexOf) {
  Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) {
    "use strict";

    if (this == null)
      throw new TypeError();

    var t = Object(this),
        len = t.length >>> 0;
    if (len === 0) return -1;

    var n = len;
    if (arguments.length > 1) {
      n = Number(arguments[1]);
      if (n != n)
        n = 0;
      else if (n != 0 && n != (1 / 0) && n != -(1 / 0))
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
    }

    var k = n >= 0
          ? Math.min(n, len - 1)
          : len - Math.abs(n);

    for (; k >= 0; k--) {
      if (k in t && t[k] === searchElement)
        return k;
    }
    return -1;
  };
}

上記コードのアルゴリズムは Firefox 及び SpiderMonky の JavaScript エンジンで実際に使用されているものと同じものです。実際にアプリケーションの中でこれを使用する場合、より複雑でないコードで fromIndex を計算可能であるかもしれません。

例: lastIndexOf を使う

lastIndexOf を使って配列中のある値の位置を探す例を以下に示します。

var array = [2, 5, 9, 2];
var index = array.lastIndexOf(2); // index is 3
index = array.lastIndexOf(7);     // index is -1
index = array.lastIndexOf(2, 3);  // index is 3
index = array.lastIndexOf(2, 2);  // index is 0
index = array.lastIndexOf(2, -2); // index is 0
index = array.lastIndexOf(2, -1); // index is 3

例: ある要素の存在をすべて見つける

以下の例は lastIndexOf を使って、与えられた配列中のある値の添字すべてを探しています。push を使って、値が見つかる度に別の配列にその添字を追加しています。

var indices = [],
    idx = array.lastIndexOf(element);

while (idx != -1) {
  indices.push(idx);
  idx = (idx > 0 ? array.lastIndexOf(element, idx - 1) : -1);
}

ここで idx == 0 の場合を分けて扱わないといけないことに注意してください。なぜなら、もし検索する値が配列の最初の要素にあると、その値は fromIndex パラメータにかかわらずいつもヒットしてしまうのです。これは indexOf メソッドとは異なります。

ブラウザ実装状況

Kangax's compat tables に基づく。

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

機能 Firefox (Gecko) Chrome Internet Explorer Opera Safari
基本サポート (有) (有) 9 (有) (有)
機能 Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
基本サポート ? ? ? ? ?

関連情報

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

タグ: 
このページの貢献者: teoli, ethertank, Potappo, Mgjbot, Yuichirou, Kozawa
最終更新者: teoli,