JavaScriptで文字列のワイルドカードマッチングを実装する方法
2つの文字列と数値 n を引数として受け取るJavaScript関数を作成してみましょう。この関数は2つの文字列を照合し、同じ文字を含んでいるかどうかを判定します。具体的には、両方の文字列が順序に関係なく同じ文字を含んでいる場合、あるいは互いに含まれない文字が最大 n 個以内である場合には true を返し、それ以外の場合には false を返します。
実装の考え方
まず1つ目の文字列を先頭から順に走査し、各文字が2つ目の文字列に含まれているかどうかを includes() メソッドで確認します。含まれていない文字が見つかるたびにカウンターを1つずつ増やし、カウンターが許容値 n を超えた時点で即座に false を返します。最後まで走査して条件を満たしていれば true を返す仕組みです。
コード例
const str1 = 'first string';
const str2 = 'second string';
const wildcardMatching = (first, second, num) => {
let count = 0;
for(let i = 0; i < first.length; i++){
if(!second.includes(first[i])){
count++;
}
if(count > num){
return false;
}
}
return true;
};
console.log(wildcardMatching(str1, str2, 2));
console.log(wildcardMatching(str1, str2, 1));
console.log(wildcardMatching(str1, str2, 0));
出力結果
コンソールには次のように出力されます。
true true false
処理の解説
'first string' と 'second string' を比較すると、1つ目の文字列にのみ含まれる文字は f の1種類だけです。そのため、許容数が1以上であれば条件を満たし true が返ります。一方、許容数が0の場合はすべての文字が一致している必要があるため、結果は false となります。
このように、ループ内で早期リターンを行うことで、許容数を超えた時点で無駄な処理を省き、効率的に判定できる点がポイントです。
-
JavaScriptの関数プロトタイプとは?仕組みと使い方を解説
JavaScriptで作成されたすべての関数には、JavaScriptエンジンによって自動的にprototypeプロパティが追加されます。このprototypeプロパティはオブジェクトであり、デフォルトではconstructorプロパティを含んでいます。関数のプロトタイプには、以下のようにしてアクセスできます。functionName.prototypeコンストラクタ関数を使ってオブジェクトを生成する場合、このprototypeプロパティを活用することで、同じコンストラクタから作成された複数のオブジェクト間でメソッドやプロパティを効率的に共有することができます。これにより、各インスタンスごとに
-
JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説
JavaScriptでは、call()、apply()、bind()という3つのメソッドを使うことで、あるオブジェクトが持つメソッドを別のオブジェクトが「借用」できます。これは、本来そのメソッドを持たないオブジェクトに対して、thisの参照先を差し替えてメソッドを実行できる便利なテクニックです。 3つのメソッドの違い call():引数をカンマ区切りで個別に渡し、即座に関数を実行します。 apply():引数を配列(または配列風オブジェクト)として渡し、即座に関数を実行します。 bind():thisを固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミン