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

【JavaScript】2つの文字列の類似性を判定するマッチング関数の実装方法

はじめに

本記事では、2つの文字列数値 n を引数として受け取り、両者の文字構成の類似性を判定するJavaScript関数の実装方法を解説します。

具体的には、以下のような仕様を持つ関数 deviationMatching を作成します。

  • 2つの文字列に含まれる文字が完全に一致していれば(順序は問わない)true を返す
  • 異なる文字があっても、その数が n 個以下であれば true を返す
  • 異なる文字が n 個を超える場合は false を返す

コード例

実際の実装コードを見てみましょう。

const str = 'some random text';
const str2 = 'some r@ndom text';

const deviationMatching = (first, second, num) => {
    let count = 0;
    for (let i = 0; i < first.length; i++) {
        // 1文字目から順に、相手側の文字列に含まれているかを確認
        if (!second.includes(first[i])) {
            count++;
        }
        // 許容範囲(num)を超えた時点で即座に false を返して処理を打ち切り
        if (count > num) {
            return false;
        }
    }
    return true;
};

console.log(deviationMatching(str, str2, 1));

出力結果

上記のコードをコンソールで実行すると、次のように出力されます。

true

処理の流れを解説

この関数の動作を、サンプルコードに沿って順を追って説明します。

  1. 初期化: 異なる文字の個数をカウントする変数 count を 0 で初期化します。
  2. ループによる照合: 第1引数の文字列 str(「some random text」)を先頭から1文字ずつ取り出し、その文字が第2引数の文字列 str2(「some r@ndom text」)に含まれているかどうかを includes() メソッドで確認します。
  3. 差分のカウント: 含まれていない文字(この例では「a」)が見つかるたびに count をインクリメントします。
  4. 早期リターン: count が許容値 num(ここでは 1)を超えた時点で、直ちに false を返します。これにより、不要なループ処理を省き、パフォーマンスを向上させています。
  5. 最終判定: ループが最後まで完了し、差分が許容範囲内であれば true を返します。

今回の例では、「some random text」と「some r@ndom text」の間で一致しない文字は「a」の1文字だけなので、許容値 1 以内に収まり、結果として true が出力されます。

まとめ

このように、シンプルなループ処理と includes() メソッドを組み合わせることで、文字列同士の類似性を効率的に判定できるマッチング関数を実装できます。誤字やタイポの検出、入力値の曖昧なバリデーションなど、さまざまな場面で応用可能です。

  1. JavaScriptでアクセント付き文字を含む文字列を並べ替える方法

    JavaScriptの標準的な sort() メソッドは、文字列をUnicodeコードポイントの順序に基づいて比較します。そのため、「é」や「ó」のようなアクセント付き文字を含む文字列を単純にソートすると、期待通りのアルファベット順にならないことがあります。この問題を解決するには、localeCompare() メソッドを使用します。このメソッドは、指定されたロケールの言語規則に従って文字列を比較できるため、アクセント付き文字も正しく並べ替えられます。localeCompare() の基本的な使い方以下は、スペイン語のアクセント付き文字を含む配列を localeCompare() を使ってソー

  2. JavaScriptの関数プロトタイプとは?仕組みと使い方を解説

    JavaScriptで作成されたすべての関数には、JavaScriptエンジンによって自動的にprototypeプロパティが追加されます。このprototypeプロパティはオブジェクトであり、デフォルトではconstructorプロパティを含んでいます。関数のプロトタイプには、以下のようにしてアクセスできます。functionName.prototypeコンストラクタ関数を使ってオブジェクトを生成する場合、このprototypeプロパティを活用することで、同じコンストラクタから作成された複数のオブジェクト間でメソッドやプロパティを効率的に共有することができます。これにより、各インスタンスごとに