JavaScriptである配列の複数の値が別の配列に存在するかどうかを確認する方法
はじめに
JavaScriptでは、2つの数値配列を受け取り、1つ目の配列のすべての要素が2つ目の配列に含まれているかどうかを判定する関数が必要になる場面があります。本記事では、その実装方法を具体的なコード例とともにわかりやすく解説します。
まず、例として次の2つの配列を用意します。
const arr1 = [34, 78, 89]; const arr2 = [78, 67, 34, 99, 56, 89];
この例では、arr1のすべての要素(34、78、89)がarr2の中に存在するかどうかをチェックします。
方法:map()とindexOf()を組み合わせる
基本的なアプローチとして、map()メソッドとindexOf()メソッドを組み合わせる方法があります。それでは実際のコードを見てみましょう。
サンプルコード
const arr1 = [34, 78, 89];
const arr2 = [78, 67, 34, 99, 56, 89];
const contains = (first, second) => {
const indexArray = first.map(el => {
return second.indexOf(el);
});
return indexArray.indexOf(-1) === -1;
}
console.log(contains(arr1, arr2));出力結果
コンソールには以下のように表示されます。
true
コードの仕組み
このコードの動作は、以下の手順で理解できます。
- インデックスの取得:first.map()により、1つ目の配列の各要素について、2つ目の配列内での位置(second.indexOf(el)の結果)を順番に取得し、新しい配列indexArrayを作成します。
- -1の判定:indexOf()は、要素が見つからなかった場合に-1を返します。そのため、indexArrayの中に-1が含まれているかどうかを調べれば、「存在しない要素があるかどうか」がわかります。
- 最終的な判定:indexArray.indexOf(-1) === -1がtrueであれば、-1がひとつも存在しない、つまり1つ目の配列のすべての要素が2つ目の配列に存在することを意味します。
より簡潔な代替方法:every()とincludes()を使う
上記の方法でも問題なく動作しますが、ES2015以降で利用できるevery()メソッドとincludes()メソッドを組み合わせると、同じ処理をさらに簡潔に記述できます。
const contains = (first, second) => first.every(el => second.includes(el)); console.log(contains(arr1, arr2)); // true
every()は、配列のすべての要素が指定した条件を満たす場合にのみtrueを返すため、「すべての要素が含まれているか」というコードの意図が直感的に伝わります。また、includes()はindexOf()と異なりNaNの比較にも正しく対応している点もメリットです。
まとめ
配列同士の包含関係を確認したい場合は、map()とindexOf()を組み合わせた方法でも、every()とincludes()を使った方法でも実装可能です。可読性と保守性を重視するなら、後者のevery()+includes()の組み合わせがおすすめです。用途や対象ブラウザの要件に応じて、適切な方法を選択しましょう。
-
複数の値でJavaScript配列の要素を検索する方法
JavaScriptである配列(arr)が、別の配列(arr1)の複数の値・すべての要素を含んでいるかどうかを確認したい場面はよくあります。そんなときは、every()メソッドとincludes()メソッドを組み合わせることで、シンプルに判定できます。以下はそのサンプルコードです。 コード例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content=
-
JavaScriptで配列を指定した個数のサブ配列に分割(チャンク化)する方法
JavaScriptでは、数値の配列を第1引数として受け取り、単一の数値 num を第2引数として受け取る関数を実装する必要があります。ここで num は常に配列の長さ以下であるものとします。この関数の役割は、num 個のサブ配列を含む新しい配列を生成することです。元の配列の長さが num でちょうど割り切れる場合、すべてのサブ配列は同じ要素数を持ちます。割り切れない場合は、最後のサブ配列だけが異なる要素数になります。入力例と期待される出力たとえば、入力が以下のようなケースを考えてみましょう。const arr = [1, 2, 3, 4, 5, 6, 7, 8]; const num = 3