JavaScript | 配列の中身を検索(indexOf / lastIndexOf)

JavaScript JavaScript
スポンサーリンク

配列内の値を探す

indexOf()lastIndexOf() は、配列から「指定した値がどこにあるか」を調べるときに使うとても基本的で便利なメソッドです。ここでは「どう動くか」「よくあるハマりどころ」「実践的な使い方」と「練習問題(解答付き)」まで、プログラミング初心者向けにやさしく説明します。


1. 基本のイメージ(まずは直感)

  • indexOf(value) → 配列の先頭(左)から探して、最初に見つかった位置(インデックス)を返す。見つからなければ -1
  • lastIndexOf(value) → 配列の末尾(右)から探して、最初に見つかった位置(=配列内で最後に現れる位置)を返す。見つからなければ -1

配列のインデックスは 0 から始まる(最初の要素が 0、次が 1…)。


2. 基本コード例(動きを確認しよう)

const arr = ['apple', 'banana', 'apple', 'cherry'];

console.log(arr.indexOf('apple'));     // 出力: 0(最初に出る 'apple' の位置)
console.log(arr.lastIndexOf('apple')); // 出力: 2(最後に出る 'apple' の位置)
console.log(arr.indexOf('orange'));    // 出力: -1(配列にない)
JavaScript

3. 検索を開始する位置を指定できる

indexOflastIndexOf は第2引数で「どこから検索を始めるか」を指定できます。

  • indexOf(value, fromIndex)fromIndex 番目から(含む)検索開始(省略時は 0)。
  • lastIndexOf(value, fromIndex)fromIndex 番目から(含む)左方向に向かって検索開始(省略時は配列の末尾)。
const arr = ['a','b','a','b','a'];

console.log(arr.indexOf('a', 2));      // 出力: 2(インデックス2から見て最初にある 'a')
console.log(arr.lastIndexOf('b', 2));  // 出力: 1(インデックス2から左に見て最初にある 'b')
JavaScript

fromIndex に負の数を入れると、配列末尾からのオフセット(-1 は最後の要素)として扱われます(ブラウザ実装で仕様通り扱われます)。


4. 型(===)による比較であることに注意

これらのメソッドは内部で 厳密等価演算子(===) を使って比較します。つまり型が違うと一致しません。

console.log([1, 2, '3'].indexOf(3));   // -1(数値の 3 はない)
console.log([1, 2, '3'].indexOf('3')); // 2(文字列 '3')
JavaScript

オブジェクトや配列の中身を探すときの落とし穴

オブジェクトや配列は参照で比較されるので、中身が同じでも別のオブジェクトは一致しない点に注意。

const a = {id: 1};
const b = {id: 1};
console.log([a].indexOf(a)); // 0
console.log([a].indexOf(b)); // -1(中身は同じでも別オブジェクト)
JavaScript

5. NaN は見つけられない(重要な例外)

NaN === NaNfalse なので、indexOf(NaN) はマッチしません(-1 が返る)。(ES6以降は Array.prototype.includes を使うと NaN を検出できます。)

console.log([NaN].indexOf(NaN));     // -1
console.log([NaN].includes(NaN));    // true  ← includes を使うと良い
JavaScript

6. よくある実用例とワンポイント

(A) 配列にその値があるかだけを知りたい(真偽値)

const arr = ['red','green'];
const hasGreen = arr.indexOf('green') !== -1;
// または modern な書き方: arr.includes('green')
JavaScript

includes() の方が読みやすく、NaN も検出できるため便利です(ただし古いブラウザだとポリフィルが必要)。

(B) 配列から最初の該当要素を削除する

const arr = ['x','y','x'];
const idx = arr.indexOf('x');
if (idx !== -1) arr.splice(idx, 1); // splice で削除
// result: ['y','x']
JavaScript

(C) 要素の重複を取り除く(簡易)

const arr = [1,2,1,3,2];
const uniq = arr.filter((v, i, self) => self.indexOf(v) === i);
// [1,2,3]
JavaScript

indexOf を使って「その要素が最初に出てきた位置と現在の位置が同じか?」で重複を除く方法です。


7. 練習問題

各問題の下にすぐ解答(コード)を載せるので、先に自分で考えてから答えを確認すると効果的です。

問題1

配列 ['cat','dog','rabbit','dog'] に対して、最初に dog が現れる位置と最後に現れる位置を indexOf / lastIndexOf で出力してください。

解答:

const animals = ['cat','dog','rabbit','dog'];
console.log(animals.indexOf('dog'));     // 1
console.log(animals.lastIndexOf('dog')); // 3
JavaScript

問題2

配列 [5,3,5,7,3] から 3 が配列内に存在するかどうかを調べ、存在すれば "ある"、なければ "ない" を出力するコードを書いてください。

解答:

const arr = [5,3,5,7,3];
console.log(arr.indexOf(3) !== -1 ? 'ある' : 'ない');
// または modern: arr.includes(3) ? 'ある' : 'ない'
JavaScript

問題3(少し発展)

配列 ['a','b','a','c','b'] から重複を取り除いて ['a','b','c'] にしたい。filterindexOf を使ってください。

解答:

const arr = ['a','b','a','c','b'];
const uniq = arr.filter((v, i, self) => self.indexOf(v) === i);
console.log(uniq); // ['a','b','c']
JavaScript

まとめ(初心者が覚えるべきポイント)

  • indexOf は左から、lastIndexOf は右から検索する。
  • 見つからなければ -1 を返す → 存在チェックには !== -1 を使う。
  • 型の違いに注意(=== で比較される)。
  • NaNindexOf では検出できない(includes を使う)。
  • オブジェクトは参照比較:同じ形でも別オブジェクトは一致しない。
  • includes() も覚えると便利(読みやすく、NaNにも対応)。
タイトルとURLをコピーしました