【JavaScript】末尾の文字が重複する文字列を配列から削除する方法
問題の概要
JavaScriptでは、文字列の配列を受け取り、末尾の文字が同じである文字列を重複なく整理する関数を作成することが求められるケースがあります。具体的には、同じ文字で終わる複数の文字列がある場合、1つだけを残して残りを配列から削除します。
例えば、次のような配列があるとします。
const arr = ['Radar', 'Cat', 'Dog', 'Car', 'Hat'];
この配列を分析すると、以下のような構成になっています。
- 「R」で終わる文字列:Radar
- 「t」で終わる文字列:Cat、Hat
- 「g」で終わる文字列:Dog
- 「r」で終わる文字列:Car
同じ末尾文字を持つ文字列は1つだけ残す必要があるため、期待される出力結果は以下の通りです。
['Radar', 'Cat', 'Dog']
解決のアプローチ
この問題は、Mapオブジェクトを使うことで効率的に解決できます。処理の手順は以下の通りです。
- 末尾の文字を記録するための空のMapを用意します。
- 配列を先頭から順番に走査し、各要素の最後の文字を取得します。
- その文字がMapにすでに登録されている場合は、
splice()メソッドで該当要素を配列から削除します。 - 未登録の場合は、Mapに文字を追加してインデックスを進めます。
ポイントは、要素を削除した際にインデックスを進めないことです。splice()で要素を取り除くと後続の要素が前に詰まるため、インデックスをそのまま維持することで処理漏れを防げます。
コード例
const arr = ['Radar', 'Cat', 'Dog', 'Car', 'Hat'];
const deleteSameEndingWords = arr => {
const map = new Map();
for(let i = 0; i < arr.length; ){
const el = arr[i];
// 文字列の末尾の文字を取得
const last = el[el.length - 1];
if(map.has(last)){
// すでに同じ末尾文字が存在する場合は削除
arr.splice(i, 1);
}else{
i++;
map.set(last, true);
};
}
};
deleteSameEndingWords(arr);
console.log(arr);実行結果
このコードを実行すると、コンソールには以下のように出力されます。
[ 'Radar', 'Cat', 'Dog' ]
まとめ
Mapを使って「すでに出現した末尾文字」を管理することで、配列を一度走査するだけで重複を排除できます。計算量はO(n)程度に抑えられ、シンプルかつ効率的な実装となります。同様の手法は、先頭の文字や特定の条件での重複除去にも応用できるので、覚えておくと便利です。
-
JavaScriptでアクセント付き文字を含む文字列を並べ替える方法
JavaScriptの標準的な sort() メソッドは、文字列をUnicodeコードポイントの順序に基づいて比較します。そのため、「é」や「ó」のようなアクセント付き文字を含む文字列を単純にソートすると、期待通りのアルファベット順にならないことがあります。この問題を解決するには、localeCompare() メソッドを使用します。このメソッドは、指定されたロケールの言語規則に従って文字列を比較できるため、アクセント付き文字も正しく並べ替えられます。localeCompare() の基本的な使い方以下は、スペイン語のアクセント付き文字を含む配列を localeCompare() を使ってソー
-
JavaScriptで配列の要素を同じ配列内に複製する方法
JavaScriptでは、concat()メソッドとsort()メソッドを組み合わせることで、既存の配列の要素を同じ配列内に複製することができます。ここでは、実際に動作するサンプルコードを使って、その手順をわかりやすく解説します。 コード例 以下は、配列の要素を同じ配列内に複製するためのコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" cont