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

JavaScriptで文字列配列内の各単語の出現回数を正確に数える方法

JavaScriptでは、2つの文字列配列を扱う場面があります。1つは単語のリストを表し、もう1つは複数の文を表すものです。例えば、以下のような配列を考えてみましょう。

const names= ["jhon", "parker"];
const sentences = ["hello jhon", "hello parker and parker", "jhonny jhonny yes parker"];

要件

ここで求められているのは、これら2つの文字列配列を引数として受け取るJavaScript関数を作成することです。

この関数は、最初の names 配列に含まれる各文字列をキーとし、sentences 配列全体におけるその出現回数を値とするオブジェクトを生成して返す必要があります。

そのため、上記の配列の場合、期待される出力は次のようになります。

const output = {
    "jhon": 1,
    "parker": 3
};

実装のポイント:正規表現を使った単語マッチング

この問題を解く鍵となるのは、正規表現(RegExp)の活用です。\b(単語境界)を使用することで、「jhonny」の中の「jhon」のような部分一致を誤ってカウントすることなく、完全な単語として一致するものだけを抽出できます。

具体的には、names配列の各要素を \b で囲んだパターンに変換し、それらを |(OR条件)で連結して1つの正規表現オブジェクトを作成します。フラグには gi を指定することで、大文字小文字を区別せず、すべての出現箇所を検索できるようにします。

コード例

実際のコードは以下の通りです。

const names = ["jhon", "parker"];
const sentences = ["hello jhon", "hello parker and parker", "jhonny jhonny yes parker"];

const countAppearances = (names = [], sentences = []) => {
    const pattern = new RegExp(
        names.map(name => `\\b${name}\\b`).join('|'),
        'gi'
    );
    const res = {};
    for (const sentence of sentences) {
        for (const match of (sentence.match(pattern) || [])) {
            res[match] = (res[match] || 0) + 1;
        }
    }
    return res;
};

console.log(countAppearances(names, sentences));

コードの解説

  • pattern の作成: names.map(name => `\\b${name}\\b`) により各名前を単語境界付きパターンに変換し、join('|') で「jhon|parker」という形式の正規表現パターンを組み立てています。
  • 'gi' フラグ: g フラグですべての出現箇所を検索対象とし、i フラグで大文字・小文字を無視します。
  • カウント処理: 各文に対して match() を実行し、マッチした結果を順番に走査しながら、オブジェクト res 内で該当する単語のカウントを1ずつ増やしていきます。
  • フォールバック: マッチが見つからなかった場合に備えて || [] を指定し、エラーを回避しています。

実行結果

コンソールに出力される結果は以下の通りです。

{ jhon: 1, parker: 3 }

この結果から、「jhon」は1回、「parker」は3回出現していることが確認できます。「jhonny jhonny」の中にある「jhon」は単語境界の指定によって正しく除外されている点に注目してください。


  1. JavaScriptで文字列を配列の指定順序どおりにシャッフルする方法

    本記事では、文字列 str を第一引数として、それと同じ長さの正の整数の配列 arr を第二引数として受け取る JavaScript 関数の実装方法を解説します。この関数は、文字列内の文字を並べ替え(シャッフル)し、i 番目の位置にある文字が、シャッフル後の文字列の arr[i] 番目の位置へ移動するようにします。入力例と期待される出力たとえば、次の文字列と配列が与えられたとします。const str = example; const arr = [5, 2, 0, 6, 4, 1, 3];この場合、期待される出力は次のとおりです。const output = alxepem;各文字がどのよう

  2. JavaScriptで配列内の唯一の異なる文字列を見つける方法

    問題 文字列の配列を受け取るJavaScript関数を作成する必要があります。配列内のすべての文字列は同じ文字(またはその並べ替え)で構成されていますが、ただ1つの文字列だけが異なる文字セットを含んでいます。この関数の目的は、その唯一の文字列を見つけ出して返すことです。 例: 次のような配列が与えられたとします。 [ba, abc, acb, bac, foo, bca, cab, cba] この場合、求めるべき文字列は「foo」です。 文字列には空白が含まれることがありますが、空白自体は意味を持たず、空白以外の記号のみが判定の対象となります。たとえば、空白だけで構成された文字列は空文字列と