JavaScriptでString.prototype.toUpperCase()を使わずに文字列を大文字へ変換する方法
はじめに
JavaScriptには、文字列を大文字に変換するための組み込みメソッド String.prototype.toUpperCase() が用意されています。しかし、学習やアルゴリズムの練習として、このメソッドを使用せずに同等の機能を自前で実装することを求められることがあります。
本記事では、文字列クラスのプロトタイプオブジェクトに新しい関数を定義し、文字列内のすべての英字を大文字に変換して返すカスタムメソッドを実装する方法を解説します。
実装のアプローチ
基本的な考え方はシンプルです。小文字のアルファベットと大文字のアルファベットの対応表(マッピング)を用意し、文字列を1文字ずつ走査しながら、小文字が見つかった場合は対応する大文字に置き換えます。英字以外の文字はそのまま保持します。
具体的な手順は以下の通りです。
- 小文字「a〜z」と大文字「A〜Z」をそれぞれ文字列として定義します。
- 元の文字列を先頭から順番に1文字ずつ取り出します。
- その文字が小文字テーブルに存在するかどうかを確認します。
- 存在すれば、同じインデックス位置にある大文字を結果に連結します。
- 存在しなければ(数字・記号・スペースなど)、元の文字をそのまま連結します。
この処理を文字数分だけ繰り返すことで、大文字に変換された新しい文字列が完成します。
サンプルコード
以下は、customToUpperCase メソッドをプロトタイプに追加した実装例です。
const str = 'This is a lowercase String';
String.prototype.customToUpperCase = function(){
const legend = 'abcdefghijklmnopqrstuvwxyz';
const UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let res = '';
for(let i = 0; i < this.length; i++){
const el = this[i];
const index = legend.indexOf(el);
if(index !== -1){
// 小文字だった場合は対応する大文字に置き換える
res += UPPER[index];
} else {
// 英字以外はそのまま使用する
res += el;
}
}
return res;
};
console.log(str.customToUpperCase());実行結果
上記のコードをコンソールで実行すると、次のような出力が得られます。
THIS IS A LOWERCASE STRING
ご覧の通り、元の文字列に含まれるすべての英字が大文字に変換され、スペースや記号はそのまま維持されています。
コードのポイント
- プロトタイプへの拡張:
String.prototypeに関数を追加することで、すべての文字列インスタンスから直接呼び出せるようになります。ただし、実際の開発では組み込みオブジェクトの変更が予期せぬ副作用を引き起こす可能性があるため、注意が必要です。 - 計算量: 文字列を一度だけ走査するため、時間計算量は O(n) です。ここでの n は入力文字列の長さを表します。
- 対応表方式:
indexOf()を使って小文字テーブルからインデックスを取得し、同じ位置の大文字を参照する仕組みにより、if文やswitch文で26通り分岐させる必要がなく、コードが簡潔になります。
まとめ
組み込みメソッドに頼らずとも、対応表とループ処理を組み合わせることで、toUpperCase() と同等の動作を簡単に再現できます。文字コード(charCodeAt())を利用する方法や正規表現を使う方法など、他の実装アプローチも存在しますので、ぜひ比較してみてください。
-
JavaScriptで元の配列を変更せずにオブジェクトのキー名を変更する方法
JavaScriptで配列内のオブジェクトのキー名(プロパティ名)を変更したい場合、deleteで直接削除してしまうと元のオブジェクトまで書き換わってしまいます。そこで役立つのが、map()メソッドとスプレッド構文(...)、分割代入を組み合わせたイミュータブル(非破壊的)な手法です。この記事では、オブジェクトのキー「name」を「fullName」に変更しながら、元の配列を一切変更しない方法をサンプルコード付きで解説します。サンプルコード<!DOCTYPE html> <html lang="ja"> <head> <meta c
-
JavaScriptで文字列内の最長の母音部分文字列の長さを求める方法
問題 文字列を引数として受け取るJavaScriptの関数を作成する必要があります。この関数は、母音(a、e、i、o、u)のみで構成される連続した部分文字列の中から、最も長いものの長さを返さなければなりません。 アプローチ この問題は、文字列を先頭から順番に走査しながら、現在連続している母音の数をカウントすることで解決できます。具体的な手順は以下の通りです。 cur:現在連続している母音の数を記録するカウンター変数 max:これまでに見つかった最長の母音連鎖の長さを保持する変数 走査中の文字が母音であれば cur を1増やし、max より大きければ max を更新する 子音に遭遇した場合は