JavaScriptで文字列内の重複する単語を検索する方法
JavaScriptで、文字列を受け取り、元の文字列の中で2回以上出現した単語だけを抜き出した新しい文字列を返す関数を作成してみましょう。
処理の内容
たとえば、次のような入力文字列が与えられたとします。
const str = "big black bug bit a big black dog on his big black nose";
この場合、「big」と「black」はそれぞれ3回出現しているため、期待される出力は次のようになります。
const output = "big black";
実装コード
それでは、この関数のコードを見ていきましょう。
const str = "big black bug bit a big black dog on his big black nose";
const findDuplicateWords = str => {
// 文字列をスペースで分割して配列にする
const strArr = str.split(" ");
const res = [];
for (let i = 0; i < strArr.length; i++) {
// 最初の出現位置と最後の出現位置が異なれば重複している
if (strArr.indexOf(strArr[i]) !== strArr.lastIndexOf(strArr[i])) {
// 結果配列にまだ含まれていない場合のみ追加
if (!res.includes(strArr[i])) {
res.push(strArr[i]);
}
}
}
return res.join(" ");
};
console.log(findDuplicateWords(str));
コードの解説
このアプローチのポイントは、indexOf()とlastIndexOf()を組み合わせている点です。
- indexOf():指定した単語が配列内で最初に現れるインデックスを返します。
- lastIndexOf():指定した単語が配列内で最後に現れるインデックスを返します。
この2つの結果が一致しない場合、その単語は配列内に複数回存在することになります。さらに、includes()でチェックすることで、同じ単語が結果に何度も追加されるのを防いでいます。
出力結果
コンソールには以下のように表示されます。
big black
補足:より効率的な代替案
indexOf()やincludes()は内部で配列全体を走査するため、単語数が多い場合は計算量がO(n²)になりがちです。パフォーマンスを重視する場合は、Setを使って出現回数をカウントする方法も有効です。
const findDuplicateWordsEfficient = str => {
const words = str.split(" ");
const countMap = new Map();
words.forEach(word => {
countMap.set(word, (countMap.get(word) || 0) + 1);
});
return [...countMap.entries()]
.filter(([, count]) => count > 1)
.map(([word]) => word)
.join(" ");
};
console.log(findDuplicateWordsEfficient(str)); // "big black"
この方法なら配列を一度走査するだけで済むため、大きなテキストデータでも高速に動作します。
-
JavaScriptで文字列内の単語を逆順に並べ替える方法
問題文(センテンス)を表す文字列を受け取り、その中に含まれる単語の順序を逆にして、新しい文字列として返すJavaScript関数を作成する必要があります。つまり、最後の単語が最初に、最後から2番目の単語が2番目に来るように、すべての単語の並びをひっくり返すということです。解決のアプローチこの問題は、標準的な配列メソッドを組み合わせるだけでシンプルに実装できます。手順は以下のとおりです。split( ) — 文字列をスペースで分割し、単語の配列を作成するreverse() — 配列の要素の順序を反転させるjoin( ) — 反転した配列をスペースで連結し、再び文字列に戻すコード例以下が実際のコー
-
JavaScriptでテキスト内の出現回数上位3つの単語を抽出する方法
課題英語のアルファベット文字列を引数として受け取るJavaScript関数を作成します。この関数は、文字列内に含まれる単語のうち、出現回数が多い上位3つの単語を返す必要があります。解決のアプローチ実装の手順は以下の通りです。1. 正規表現を使って記号やアンダースコアなどの不要な文字を除去し、連続する空白を1つにまとめます。2. 文字列をすべて小文字に変換してから、スペース区切りで配列に分割します。3. オブジェクト(マップ)を使って各単語の出現回数をカウントします。4. 出現回数の降順にソートし、上位3つの単語を返します。コード例以下が実際のコードです。 b[1] - a[1]);