【JavaScript】2つの文字列から共通する部分文字列を抽出して返す関数の実装方法
本記事では、2つの文字列を引数として受け取り、両方の文字列に共通して含まれる部分文字列をすべて抽出し、その結果を返すJavaScript関数の実装方法を解説します。
やりたいことの整理
今回作成する関数には、次のような役割が求められます。
- 引数として2つの文字列を受け取る
- 片方の文字列から生成できるすべての部分文字列を調べ、もう片方の文字列にも含まれているかどうかを確認する
- 共通する部分文字列を重複なくまとめ、最終的にその結果を呼び出し元へ返す
サンプルコード
実際のコードは以下のとおりです。
const str1 = "IloveLinux";
const str2 = "weloveNodejs";
const findCommon = (str1 = '', str2 = '') => {
const common = Object.create(null);
let i, j, part;
for (i = 0; i < str1.length - 1; i++) {
for (j = i + 1; j <= str1.length; j++) {
part = str1.slice(i, j);
if (str2.indexOf(part) !== -1) {
common[part] = true;
}
}
}
const commonEl = Object.keys(common);
return commonEl;
};
console.log(findCommon(str1, str2));
コードのポイント解説
この実装では、まず Object.create(null) を使ってプロトタイプを持たない空のオブジェクトを生成し、見つかった共通部分文字列をキーとして記録することで、自動的に重複を排除しています。
続いて二重の for ループにより、1つ目の文字列から切り出せるすべての部分文字列を slice(i, j) で順番に生成します。それぞれの部分文字列が2つ目の文字列に存在するかどうかを indexOf() で判定し、存在すればオブジェクトに登録します。
最後に Object.keys() を使ってオブジェクトのキー一覧を配列として取得し、それを戻り値として返しています。
実行結果
上記のコードを実行すると、コンソールには次のように出力されます。
[
'l', 'lo', 'lov',
'love', 'o', 'ov',
'ove', 'v', 've',
'e'
]
出力を見ると、"IloveLinux" と "weloveNodejs" の両方に含まれる「l」「lo」「love」「o」「ve」「e」といった共通の部分文字列が、すべて配列として抽出できていることがわかります。
-
JavaScriptで2つの文字列を連結する方法|スペースの有無で変わる正しい書き方
JavaScriptで2つの文字列をつなげる(連結する)には、「+」演算子を使用します。文字列と文字列の間にスペースを入れたい場合も、この演算子だけで簡単に実現できます。ポイントは、「1つ目の文字列の末尾にすでにスペースが含まれているかどうか」です。含まれている場合は余計な処理は不要で、含まれていない場合は半角スペースを明示的に挟む必要があります。それぞれのケースを見ていきましょう。ケース1:最初の文字列にすでにスペースが含まれている場合1つ目の文字列の末尾にスペースが含まれているなら、単純に連結だけで十分です。スペースを明示的に追加すると、逆に空白が二重になってしまうので注意しましょう。コー
-
JavaScriptの分割代入を使った関数パラメータの受け渡し方法
JavaScriptでは、関数にオブジェクトを引数として渡す際、「分割代入(デストラクチャリング)」と呼ばれる構文を利用することで、オブジェクトの各プロパティを個別の変数として受け取ることができます。 さらに、各プロパティにデフォルト値を指定しておけば、対応するプロパティが存在しない場合でもエラーにならず、あらかじめ設定した値が使用されます。これにより、安全で柔軟な関数設計が可能になります。 サンプルコード 以下は、分割代入を使って関数のパラメータを受け取るJavaScriptのコード例です。 <!DOCTYPE html> <html lang="en&quo