JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで複数の文字列を条件に配列をフィルタリングする方法

JavaScriptで、複数のキーワード(文字列)をすべて含む要素だけを配列から抽出したいケースはよくあります。本記事では、forループとindexOf()メソッドを組み合わせた基本的な実装方法を解説し、あわせてより簡潔に書けるモダンな代替手段も紹介します。

基本の実装例:forループとindexOf()を使う方法

考え方はシンプルです。各文字列に対して、検索対象のキーワードがすべて含まれているかを順番にチェックし、すべて含まれている場合のみ結果用の配列に追加します。

var details = [
  'My first Name is John and last Name is Smith',
  'My first Name is John and last Name is Doe',
  'Student first Name is John and last Name is Taylor'
];
var isPresent;
var records = [];
var matchWords = ['John', 'Doe'];

for (var index = 0; index < details.length; index++) {
  isPresent = true;
  for (var outer = 0; outer < matchWords.length; outer++) {
    if (details[index].indexOf(matchWords[outer]) === -1) {
      isPresent = false;
      break;
    }
  }
  if (isPresent) {
    records.push(details[index]);
  }
}
console.log(records);

コードのポイント

  • indexOf()は、指定した文字列が見つからない場合に-1を返します。
  • どれかひとつのキーワードでも見つからなければ、フラグをfalseにして内側のループを即座に抜けます。
  • 最後までtrueのままだった文字列だけが、push()によって結果配列に追加されます。

プログラムの実行方法

Node.js環境で上記のプログラムを実行するには、以下のコマンドを使用します。ここではファイル名を「demo151.js」として保存しています。

node demo151.js

出力結果

プログラムを実行すると、「John」と「Doe」の両方を含む文字列のみが出力されます。

PS C:\Users\Amit\JavaScript-code> node demo151.js
[ 'My first Name is John and last Name is Doe' ]

よりモダンな書き方:filter()とevery()の組み合わせ

ES6以降では、Array.prototype.filter()とevery()を組み合わせることで、同じ処理をはるかに簡潔に記述できます。

const details = [
  'My first Name is John and last Name is Smith',
  'My first Name is John and last Name is Doe',
  'Student first Name is John and last Name is Taylor'
];
const matchWords = ['John', 'Doe'];

const records = details.filter(str =>
  matchWords.every(word => str.includes(word))
);

console.log(records);
// [ 'My first Name is John and last Name is Doe' ]

every()は「配列内のすべての要素が条件を満たすか」を判定するメソッドのため、「すべてのキーワードを含む」という条件をそのまま自然に表現できます。可読性の面でも、新しいプロジェクトではこちらの書き方が推奨されます。

まとめ

  • 従来の書き方:二重のforループ+indexOf()でキーワードの存在を判定する
  • モダンな書き方:filter()+every()(+includes())で簡潔かつ直感的に記述できる
  1. 複数の値でJavaScript配列の要素を検索する方法

    JavaScriptである配列(arr)が、別の配列(arr1)の複数の値・すべての要素を含んでいるかどうかを確認したい場面はよくあります。そんなときは、every()メソッドとincludes()メソッドを組み合わせることで、シンプルに判定できます。以下はそのサンプルコードです。 コード例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content=

  2. JavaScriptでフラットなオブジェクト配列をツリー構造に変換する方法

    はじめにWeb開発では、カテゴリ一覧やフォルダ構成、組織図など、階層構造をもつデータを画面に表示したい場面がよくあります。一方で、データベースやAPIから取得したデータは、idとparentIdを持つフラット(一次元)な配列として渡されることがほとんどです。本記事では、こうしたフラットな配列をもとに、子要素を親オブジェクトへリンクさせたツリー構造を組み立て、ネストされたリスト形式で画面に表示するまでの手順を、HTML・CSSのコード付きでわかりやすく解説します。元データとなるフラットな配列まず、変換対象となるデータを確認しましょう。各オブジェクトは、自身の一意な識別子であるid、表示名のnam