JavaScript

【JS】配列検索はsome?every?find?indexOf?includes?test?exec?match?search?

こんにちは!今日は配列検索、つまり「配列に含むか」を探す系のメソッドを比較します。

最も簡単な方法

数列の中から特定の数字を探すようなケースを想定すると…

const arr = [ 0, 1, 2, 0, 8, 2, 8, 8, 2, 8, ]

.includes

一番シンプルなのは.includesですね:)

const answerTrue  = arr.includes(8)
const answerFalse = arr.includes(7)

console.log(answerTrue) // true
console.log(answerFalse)// false

8は含まれているのでtrue、7はないのでfalse。

かなり簡単な方法

.indexOf

.includesはレガシーブラウザだと未対応だったりします。

そんな場合は.indexOf使いましょう:)

const answerTrue  = !! ~ arr.indexOf(8)
const answerFalse = !! ~ arr.indexOf(7)

console.log(answerTrue) // true
console.log(answerFalse)// false

ちょっと黒魔術チックですがまあ簡単です。

若干面倒な方法

.some

ぶっちゃけ上2つで十分ですが.someもやってみます。

以後console.log省略。

const answerTrue  = arr.some(n => n === 8)// true
const answerFalse = arr.some(n => n === 7)// false

.find

.findだとこう。

const answerTrue  = !! arr.find(n => n === 8)// true
const answerFalse = !! arr.find(n => n === 7)// false

.findのこのやり方はfalsyな値(0とか)の操作には使えないです

.every

今回の例のように数字のみならこんなのも可。ちょっと短くなります。ちょっとすぎだろ。

const answerTrue  = arr.every(n => n - 8)// true
const answerFalse = arr.every(n => n - 7)// false

超面倒(正規表現)

取り入れられた正規表現、加速した糞コードは危険な領域へと突入する。

.test

const answerTrue  = RegExp(`^(${arr.join('|')})$`).test(8)// true
const answerFalse = RegExp(`^(${arr.join('|')})$`).test(7)// false

.exec

const answerTrue  = !! RegExp(`^(${arr.join('|')})$`).exec(8)// true
const answerFalse = !! RegExp(`^(${arr.join('|')})$`).exec(7)// false

.match

const answerTrue  = !! (`${8}`).match(RegExp(`^(${arr.join('|')})$`))// true
const answerFalse = !! (`${7}`).match(RegExp(`^(${arr.join('|')})$`))// false
const answerTrue  = !! ~ (`${8}`).search(RegExp(`^(${arr.join('|')})$`))// true
const answerFalse = !! ~ (`${7}`).search(RegExp(`^(${arr.join('|')})$`))// false

おわりに

.includesが優秀すぎて比較する余地がなかったわ。