【JavaScript】大文字だけを先頭に移動する方法|相対的な順序はそのまま維持
今回は、大文字と小文字が混在した文字列を受け取り、すべての大文字を文字列の先頭へ移動した結果を返すJavaScript関数を作成します。ポイントは、単に大文字を前に集めるだけでなく、元の文字同士の相対的な順序を崩さないことです。
処理のイメージ
たとえば、入力文字列が次のようになっているとします。
const str = 'heLLO woRlD';
この場合、期待される出力は以下のとおりです。
const output = 'LLORDhe wol';
ご覧のとおり、「L・L・O・R・D」という大文字の並び順、および「h・e・o・w・l」という小文字の並び順は、それぞれ元の文字列内での登場順序が保たれています。
実装コード
以下が実際のコードです。
const str = 'heLLO woRlD';
const moveCapitalToFront = (str = '') => {
let capitalIndex = 0;
const newStrArr = [];
for(let i = 0; i < str.length; i++){
if(str[i] !== str[i].toLowerCase()){
newStrArr.splice(capitalIndex, 0, str[i]);
capitalIndex++;
}else{
newStrArr.push(str[i]);
};
};
return newStrArr.join('');
};
console.log(moveCapitalToFront(str));コードの解説
この関数の仕組みを順番に見ていきましょう。
1. 挿入位置の管理
変数 capitalIndex は、「次に大文字を挿入すべき位置」を追跡するためのカウンターです。初期値は0(配列の先頭)です。
2. 大文字かどうかの判定
str[i] !== str[i].toLowerCase() という条件式で、現在の文字を小文字に変換しても元の文字と異なる場合、つまり大文字であると判定できます。
3. 大文字の挿入
大文字だった場合は splice(capitalIndex, 0, str[i]) を使い、これまでに見つかった大文字の直後に新しい大文字を挿入します。こうすることで、大文字同士の相対的な順序が自然に維持されます。挿入後は capitalIndex をインクリメントします。
4. 小文字の追加
小文字だった場合は push() で配列の末尾に追加するだけです。小文字も元の順序どおりに並ぶため、結果的に全体の相対順序が保たれます。
5. 結果の結合
最後に join('') で配列を文字列に戻して返却します。
実行結果
コンソールには次のように出力されます。
LLORDhe wol
このように、ループ処理と splice() を組み合わせることで、ソート処理を使わずともO(n)に近い効率で大文字を先頭に集約でき、しかも元の順序を完全に保持できます。
-
JavaScriptでスペースの位置を維持したまま文字列を反転させる方法
問題空白(スペース)を含む可能性のある文字列を受け取り、各単語の文字順だけを反転させるJavaScript関数を作成することを考えます。求められる条件は次のとおりです。単語内部の文字は逆順に並べ替える単語と単語を区切るスペースの位置は元のまま維持する異なる単語の文字同士が入れ替わらないようにするアプローチ基本となるアイデアは、「元の文字列を末尾から先頭へ向かって走査し、空白以外の文字を結果用の文字列へ追加していく」というものです。文字を追加するたびに、結果文字列の現在の長さをインデックスとして元の文字列を参照し、その位置がスペースであれば同じくスペースを結果に加えます。こうすることで、スペース
-
JavaScriptで特定の文字列の順序に従って文字列を並べ替える方法
問題 2つの文字列 str1 と str2 を第1・第2引数として受け取るJavaScript関数を作成する必要があります。 この関数は、str1 を str2 に含まれる文字の出現順序に従って並べ替えます。 例えば、関数への入力が以下の場合を考えてみましょう。 入力 const str1 = coding; const str2 = gncabdi; 出力 const output = gncdio; 出力の説明 str2 の中で先に現れる文字が優先的に前に配置され、その後に後から現れる文字が続きます。そして最後に、str2 に存在しない残りの文字がそのまま並べられます。 解決のアプローチ