JavaScriptで配列に含むか検索する5つの方法!

JavaScript

JavaScriptで配列に要素を含んでいるか検索する方法について書いています。
配列の要素を含むか確認する時には、下記のメソッドを使います。

・includesメソッド
・indexOfメソッド
・findIndexメソッド
・everyメソッド
・someメソッド

includesメソッドで含むか確認する

配列からincludesメソッドを使うことで、要素を含んでいるか確認することができます。
includesメソッドは要素がある場合はtrueを返して、要素がない場合はfalseを返します。

例えば、下記のように使います。

let drinks = ['beer', 'wine', 'milk', 'coffee']
let result = drinks.includes('coffee')

if (result) {
    console.log("drinksにcoffeeが含まれる")
}

最初にdrinks配列を4つの要素で初期化して作成しています。

次の行で、includesを呼び出しています。
引数に渡しているのは、検索する要素です。今回は「coffee」を渡しています。
そのため、drinks配列に「coffee」を含むか探します。

要素が見つかった(含んでいた)場合は、trueが返ってきます。
見つからなかった場合には、falseが返ってきます。

今回のコードだと、要素を含んでいるので、if文の処理を通ります。
「drinksにcoffeeが含まれる」が出力されて、処理が終了します。

indexOfメソッドで含むか確認する

配列からindexOfメソッドを使って、要素を含んでいるか確認できます。
indexOfメソッドは要素がある場合には要素番号を返してくれます。ない場合には-1返ってきます。

例えば、下記のように使います。

let drinks = ['beer', 'wine', 'milk', 'coffee']
let result = drinks.indexOf('milk')

if (result !== -1) {
    console.log("drinksにmilkが含まれる")
}

最初にdrinks配列を4つの要素で初期化して作成しています。

次の行で、indexOfを呼び出しています。
引数に渡しているのは、検索する要素です。今回は「milk」を渡しています。

要素が見つかった(含んでいた)場合は、要素番号が返ってきます。
見つからなかった場合には、「-1」が返ってきます。

今回のコードだと、要素を含んでいます。
「milk」は配列の0番目から数えて、2番目なので、result変数には「2」が返ってきます。

if文の処理を「-1」じゃなかったら通るので、「drinksにmilkが含まれる」を出力して、処理を終了します。

直接if文に返り値を入れない

if文に直接、下記のようにindexOfメソッドの返り値を入れると、2点問題があります。

if (result) {
    console.log("drinksにmilkが含まれる")
}

0番目の要素があった場合は「0」が返ってきますが、要素があるのにif文の中を通りません。
また、要素がなかった場合の「-1」の時にもif文の中を通るので、indexOfの要素番号を条件に使う場合には「-1」と比べる必要があります。

findIndexメソッドで含むか確認する

findIndexメソッドを使うと、配列の要素を比較関数で調べて、比較値とあっていた場合に要素番号を返します。

let drinks = ['beer', 'wine', 'milk', 'coffee']

let result = drinks.findIndex((value) => value === 'coffee')
if (result !== -1) {
    console.log("drinksにcoffeeが含まれる:" + result)
}

最初にdrinks配列を4つの要素で初期化して作成しています。

次の行で、findIndexを呼び出しています。
引数に渡しているのは比較関数です。要素がひとつずつvalueとして渡されて、比較されます。
今回は「coffee」と同じかを比較しています。

同じ要素があるので、要素番号の「3」がresult変数に返ってきます。
比較した結果、同じ要素がない場合は、「-1」が返ってきます。

結果、「drinksにcoffeeが含まれる:3」が返ってきて処理が終了します。

一部を比較する

比較関数なので、関数の中で自由に要素を比較することが可能です。
下記では、先頭文字が「m」だった時の要素番号を返すようにしました。

let drinks = ['beer', 'wine', 'milk', 'coffee']

let result = drinks.findIndex((value) => {
    return 'm' === value.substring(0, 1)
})
console.log(result) // 2

比較関数の中で、要素の先頭の文字をsubstringで抜き出して、比較しています。
先頭の文字が「m」なのは0番目から数えて、2番目の「milk」なので、要素番号として「2」が返ってきます。

everyで含むか確認する

everyメソッドでも比較関数を使って、配列の値を検証します。
配列の要素を全て比較して、全て条件に合っていたときにtrueを返します。それ以外はfalseになります。

let scores = [50, 60, 70, 66, 55]

let result = scores.every((value) => {
    return value >= 50
})
console.log(result) // true

最初にscores配列を5つの数値を入れて作成しました。

その次にscores配列からeveryメソッドを呼んでいます。
比較関数の内容は「value >= 50」としています。
全ての要素(value変数)が50以上の場合には、result変数にtrueが返ってきます。
ひとつでも、違う場合にはfalseです。

今回は、全ての要素が比較関数で書いた条件に合います。
console.logで出力すると、trueが返ってきていることが確認できました。

someで含むか確認する

someメソッドでも比較関数を使って、配列の値を検証します。
someメソッドでは配列の要素を全て比較して、ひとつでも条件にあっていたときにtrueになります。
それ以外はfalseになります。

everyメソッドと違うのは、ひとつでもあっていた場合にtrueになるというところです。

let scores = [33, 58, 70, 69, 55]

let result = scores.some((value) => {
    return value >= 70
})
console.log(result) // true

先ほどのプログラムを少し変えて、someメソッドで比較するようにしてみました。
someメソッドの引数に比較関数を渡しています。

今回は「value >= 70」で比較しています。
scores配列に70以上の値が、ひとつあるので、合っていることになってtrueが返ってきます。
結果、console.logで出力するとtrueになりました。

このように、someではひとつでも条件に合っていればtrueになります。
ひとつも条件に合わない場合にはfalseが返ってきます。

配列に含むか検索するメソッドまとめ

紹介した5つのメソッドを表にまとめてみました。

メソッド 比較方法 返り値
includes 引数の値と同じか trueまたはfalse
indexOf 引数の値と同じか 配列の要素番号。見つからない場合は「-1」
findIndex 比較関数で探す 配列の要素番号。見つからない場合は「-1」
every 比較関数で探す 要素が比較内容に全て合っている場合にtrue、そうでない場合false
some 比較関数で探す 要素がひとつでも合っている場合にtrue、そうでない場合false

それぞれ、下記のようなシーンで使うと良いのではないでしょうか。

・includesメソッド:単純に要素があるか調べたい
・indexOfメソッド:単純に要素があるか調べて、要素番号が欲しい
・findIndexメソッド:比較関数で要素があるか調べて、要素番号が欲しい
・everyメソッド:全ての要素が比較関数の条件に合っているか調べたい
・everyメソッド:全ての要素の中で、ひとつでも比較関数の条件に合っているか調べたい

コメント

タイトルとURLをコピーしました