JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでlastIndexOf()関数を自作し、Array.prototypeをオーバーライドする方法


lastIndexOf()関数とは?

JavaScriptのlastIndexOf()メソッドは、引数として渡された要素が配列内に存在する場合、その最後に現れる位置(インデックス)を返します。要素が存在しない場合は -1 を返します。

例を見てみましょう。

[3, 5, 3, 6, 6, 7, 4, 3, 2, 1].lastIndexOf(3); // 結果: 7

この配列では 3 が合計3回出現しますが、そのうち最も後ろにあるのはインデックス 7 の位置のため、戻り値は 7 となります。

実装の目標

既存の lastIndexOf() と同じ機能を持つJavaScript関数を自作し、それでデフォルトの Array.prototype.lastIndexOf()オーバーライド(上書き)してみます。

実装の方針はとてもシンプルです。

  • 配列を末尾から先頭に向かって順番に走査する
  • 目的の要素が見つかった時点で、そのインデックスを即座に返す
  • 最後まで見つからなければ -1 を返す

後ろから探索することで、最初に一致した要素が自動的に「最後の出現位置」となります。

サンプルコード

以下が実際のコードです。

const arr = [3, 5, 3, 6, 6, 7, 4, 3, 2, 1];

// Array.prototype.lastIndexOf を独自実装で上書き
Array.prototype.lastIndexOf = function (el) {
  for (let i = this.length - 1; i >= 0; i--) {
    if (this[i] !== el) {
      continue; // 一致しなければ次の要素へ
    }
    return i; // 見つかったらインデックスを返す
  }
  return -1; // 最後まで見つからなければ -1
};

console.log(arr.lastIndexOf(3));

出力結果

このコードを実行すると、コンソールには次のように表示されます。

7

コードのポイント

  • this.length - 1 からスタート: 配列の末尾インデックスは「長さ − 1」なので、そこから降順でループさせます。
  • 厳密等価比較(!==)を使用: 値だけでなく型も含めて判定しており、ネイティブの lastIndexOf() の挙動(NaN が常に見つからない点など)に近くなっています。
  • 計算量は O(n): 配列を最大1回だけ走査すれば済む、効率的な線形探索です。

注意点

ビルトインのプロトタイプを上書きするのは、仕組みを理解するための学習としては有益ですが、実際のプロダクションコードでの直接上書きは推奨されません。他のライブラリとの競合や仕様との不一致を引き起こす可能性があるため、あくまで演習として扱うのが安全です。

  1. JavaScriptのArray.prototype.sort()メソッドの使い方をサンプルコードで解説

    Array.prototype.sort()は、JavaScriptで配列の要素を並べ替えるための組み込みメソッドです。アルファベット順・数値順といった並び方に加えて、昇順・降順も自由に指定でき、配列操作の中でも特に使用頻度の高いメソッドの一つです。 ただし重要なポイントとして、sort()メソッドはデフォルトではすべての要素を文字列に変換してから比較します。そのため、数値の配列を意図したとおりに並べ替えたい場合は、比較関数を引数として渡す必要があります。 以下は、Array.prototype.sort()メソッドの基本的な使い方を示すサンプルコードです。 サンプルコード <!DOC

  2. JavaScriptのArray.prototype.flat()メソッドとは?配列を指定した深さで平坦化する方法

    Array.prototype.flat()メソッドとはJavaScriptのArray.prototype.flat()メソッドは、ネストされた配列を指定した深さまで再帰的に平坦化(フラット化)するためのメソッドです。元の配列を変更することはなく、平坦化された新しい配列を作成して返します。引数には平坦化の深さ(depth)を数値で指定します。省略した場合はデフォルトで「1」が適用され、「Infinity」を指定すればすべての階層のネストを完全に展開することも可能です。コード例以下は、Array.prototype.flat()メソッドを使用したサンプルコードです。<!DOCTYPE h