JavaScript | indexOf() / lastIndexOf() / includes() / find() / findIndex() と比較して、どれをいつ使うか図解で説明

JavaScript JavaScript
スポンサーリンク

練習問題 — 「どのメソッドを使う?」クイズ(解答+解説付き)

学んだことを定着させるには問題を解くのが一番。以下は段階的に難しくなる 10問 のクイズです。
各問題は「どのメソッドを使うべきか(複数選択可)」を問います。まず自分で考えてから解答と解説を読んでください。最後に「使い分けの早見表」も付けます。


問題1(超基本)

配列 ['red','green','blue']'green' が含まれているかだけを調べたい。どのメソッドを使う?

A. indexOf('green')
B. includes('green')
C. find(u => u === 'green')

解答・解説

正解:B(includes(A も可だが B が最もシンプル)

  • includes() は存在チェックに最適で true / false を返します。indexOf() でも可能(!== -1)ですが読みやすさで includes が推奨。
const arr = ['red','green','blue'];
console.log(arr.includes('green')); // true
JavaScript

問題2(位置が欲しい)

配列 ['a','b','c','b']'b' が最初に出るインデックスを知りたい。どれを使う?

A. indexOf('b')
B. lastIndexOf('b')
C. findIndex(x => x === 'b')

解答・解説

正解:A または C(どちらでも)

  • indexOf('b') が一番シンプル。findIndex(x => x==='b') でも同じ結果になります。lastIndexOf は最後に出る位置を返すので不適。
const arr = ['a','b','c','b'];
console.log(arr.indexOf('b')); // 1
JavaScript

問題3(最後に出る位置)

['x','y','x','z']'x'最後に出る位置を知りたい。どれ?

A. indexOf('x')
B. lastIndexOf('x')
C. findIndex(x => x === 'x')

解答・解説

正解:B(lastIndexOf

  • lastIndexOf は右側から検索して最後に現れる位置を返します。
const arr = ['x','y','x','z'];
console.log(arr.lastIndexOf('x')); // 2
JavaScript

問題4(オブジェクトを条件で探す)

ユーザー配列 [{name:'A',age:17},{name:'B',age:21}]最初に age >= 20 の人 のオブジェクトを取り出したい。どれ?

A. includes()
B. find(u => u.age >= 20)
C. indexOf({name:'B',age:21})

解答・解説

正解:B(find

  • 条件でオブジェクトを探す場合は find(要素そのものを返す)。indexOf はオブジェクトの参照一致しか見ないので使えない。
const users = [{name:'A',age:17},{name:'B',age:21}];
console.log(users.find(u => u.age >= 20)); // {name: "B", age: 21}
JavaScript

問題5(条件の「位置」を知りたい)

同じ users 配列で 年齢 >= 20 の最初の人のインデックス を知りたい。どれ?

A. find()
B. findIndex(u => u.age >= 20)
C. indexOf(u => u.age >= 20)

解答・解説

正解:B(findIndex

  • findIndex は条件に合う要素のインデックスを返します。indexOf は値(===)比較のみなのでコールバックは取れません。
console.log(users.findIndex(u => u.age >= 20)); // 1
JavaScript

問題6(NaNの検出)

配列 [NaN]NaN が含まれているか確かめたい。どれを使う?

A. indexOf(NaN)
B. includes(NaN)
C. find(x => Number.isNaN(x))

解答・解説

正解:B または C(A は不可)

  • indexOf(NaN)-1 を返す(NaN === NaN が false)。includes(NaN)true(ES6仕様)。また find(x => Number.isNaN(x)) でも検出可。
console.log([NaN].includes(NaN)); // true
console.log([NaN].find(x => Number.isNaN(x))); // NaN
JavaScript

問題7(重複除去)

配列 [1,2,1,3] から 重複を取り除きたいindexOf を使った方法の意図はどれか?

A. arr.filter((v,i,self) => self.indexOf(v) !== i)
B. arr.filter((v,i,self) => self.indexOf(v) === i)
C. arr.find(v => self.indexOf(v) === i)

解答・解説

正解:B

  • filter の中で「その値が配列の最初に現れた位置と今の位置が同じ」なら最初の出現なので残す。A は逆で重複だけ残してしまう。
const arr = [1,2,1,3];
const uniq = arr.filter((v,i,self) => self.indexOf(v) === i); // [1,2,3]
JavaScript

問題8(真偽値 vs 要素)

「配列に条件を満たす要素が1つでもあるかどうか(true/false)」を調べたい。どれが適切?

A. find()
B. some()
C. includes()

解答・解説

正解:B(some

  • some は条件に合うものがあれば true を返す。find() はその要素自体を返す(存在の真偽は !!find(...) で取れるが some が直感的)。
const users = [{age:10},{age:30}];
console.log(users.some(u => u.age >= 20)); // true
JavaScript

問題9(複雑な条件での存在チェック)

「名前が ‘Taro’ かつ age >= 18 のユーザーがいるか」を素早く調べたい。推奨は?

A. users.find(u => u.name === 'Taro' && u.age >= 18)
B. users.some(u => u.name === 'Taro' && u.age >= 18)
C. users.includes({name:'Taro', age:18})

解答・解説

正解:B(some) が読みやすく直感的。A(find) も使える(true/false が必要なら !! を付ける)。C はオブジェクト参照比較なので不可。

console.log(users.some(u => u.name === 'Taro' && u.age >= 18)); // true/false
JavaScript

問題10(選択問題:最適なメソッドを選べ)

あなたは次の処理をしたい:
「ユーザー配列から、スコアが 80 以上の最初のユーザーインデックス を取得し、存在すればそのユーザーを削除する(splice を使う)」。どの組み合わせが最も適切?

A. findIndex() でインデックスを取得 → splice
B. find() で要素を取得 → indexOf で位置を取得 → splice
C. includes() で存在チェック → findIndex()splice

解答・解説

正解:A(findIndex → splice) が簡潔で効率的。B は二度手間(オブジェクトが同一参照なら機能するが冗長)。C は includes は値などの単純比較向けで無駄。

const idx = users.findIndex(u => u.score >= 80);
if (idx !== -1) users.splice(idx, 1);
JavaScript

最後に:クイック早見表(覚えやすいまとめ)

  • includes(val)存在チェック(true/false)
  • indexOf(val)値の最初の位置(インデックス)
  • lastIndexOf(val)値の最後の位置
  • find(callback)条件を満たす要素(そのもの)
  • findIndex(callback)条件を満たす要素の位置
  • some(callback)条件に合う要素があるか(true/false)
タイトルとURLをコピーしました