.lastIndexOf()

lastIndexOf()メソッドは、与えられた要素が配列内で見つかった最後のインデックス番号を返し、見つからなければ-1を返します。配列はfromIndexが逆向きに検索されます。

文法

array.lastIndexOf(searchElement[, fromIndex])
引数 説明
searchElement 配列内を検索する要素を指定します。
fromIndex 逆向きに検索を開始するインデックス番号を指定します。 デフォルトは配列のlengthとなり、配列全体が検索されます。 もしインデックスが配列のlengthと同じ、またはそれ以上であれば、配列全体が検索されます。 負の値であれば、配列の終端からカウントした場所になります。 インデックスが負の値である場合でも、配列は後ろから前の方向へ検索されることに注意してください。 もしインデックスが0より小さい場合、-1が返され、配列は検索されません。

説明

lastIndexOfsearchElementを配列の要素と、厳格な等価によって比較します。 (===、トリプルイコール演算子)

例: lastIndexOfの使用について

下記の例では、lastIndexOfを使用して配列の値を探しています。

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

例: ある特定の要素を全て検索

下記の例はlastIndexOfを使用して、与えられた配列の要素のインデックスを全て見つけ、 それを別の配列にpushを使用して追加しています。

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

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

配列の最初の要素である場合、 要素は常にfromIndexパラメーターに関係なく検索されるため、 ここではidx == 0の場合と別々に扱わなければならないことに注意してください。 これは、indexOfメソッドとは異なります。

Polyfill

lastIndexOfは5thエディションのECMA-262標準で追加されたため、 他の標準実装では提供されていないかもしれません。 この解決策として、あなたのスクリプトが始まる前に下記のコードを挿入することで、 ネイティブにサポートされていない場合に、lastIndexOfが使用出来るようになります。 このアルゴリズムは5thエディションのECMA-262標準の仕様と一致するもので、 ObjectTypeErrorNumberMath.floorMath.absMath.minは、 それらの元の値であるとみなします。(翻訳に自信なし)

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

    if (this === void 0 || this === null) {
      throw new TypeError();
    }

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

    n = len - 1;
    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));
      }
    }

    for (k = n >= 0
          ? Math.min(n, len - 1)
          : len - Math.abs(n); k >= 0; k--) {
      if (k in t && t[k] === searchElement) {
        return k;
      }
    }
    return -1;
  };
}

また、この実装は、FirefoxとSpiderMonkeyのJavaScriptエンジンとの幾つかの極端なケースを含んだ、 完全な互換性を目的としていることに注意してください。 実際のアプリケーショでこれを使用することを考えている場合、 それらのケースを無視するのであれば、より簡単な計算で問題ないかもしれません。

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本 9
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。