配列内の値を探す
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(配列にない)
JavaScript3. 検索を開始する位置を指定できる
indexOf と lastIndexOf は第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')
JavaScriptfromIndex に負の数を入れると、配列末尾からのオフセット(-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(中身は同じでも別オブジェクト)
JavaScript5. NaN は見つけられない(重要な例外)
NaN === NaN が false なので、indexOf(NaN) はマッチしません(-1 が返る)。(ES6以降は Array.prototype.includes を使うと NaN を検出できます。)
console.log([NaN].indexOf(NaN)); // -1
console.log([NaN].includes(NaN)); // true ← includes を使うと良い
JavaScript6. よくある実用例とワンポイント
(A) 配列にその値があるかだけを知りたい(真偽値)
const arr = ['red','green'];
const hasGreen = arr.indexOf('green') !== -1;
// または modern な書き方: arr.includes('green')
JavaScriptincludes() の方が読みやすく、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]
JavaScriptindexOf を使って「その要素が最初に出てきた位置と現在の位置が同じか?」で重複を除く方法です。
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'] にしたい。filter と indexOf を使ってください。
解答:
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を使う。 - 型の違いに注意(
===で比較される)。 NaNはindexOfでは検出できない(includesを使う)。- オブジェクトは参照比較:同じ形でも別オブジェクトは一致しない。
includes()も覚えると便利(読みやすく、NaNにも対応)。
