JavaScriptで特定のルールに従って文字列を反転する方法
問題の概要
今回は、文字列 str を第一引数、整数 num を第二引数として受け取るJavaScript関数を作成します。
この関数が満たすべき要件は以下のとおりです。
- 基本ルール: 文字列の先頭から数えて 2 × num 文字ごとのブロックに着目し、各ブロックの最初の num 文字だけを反転させる。残りの部分は元の順序のまま維持する。
- 残りが num 文字未満の場合: 残った文字をすべて反転する。
- 残りが num 文字以上・2 × num 文字未満の場合: 最初の num 文字のみを反転し、残りはそのまま出力する。
具体例で確認する
たとえば、入力として次のような文字列と数値が与えられたとします。
const str = 'klmnopq'; const num = 2;
このとき、期待される出力は次のようになります。
const output = 'lkmnpoq';
処理の流れを追ってみましょう。
- 最初の4文字(2 × num = 4)である「klmn」に注目し、先頭の2文字「kl」を反転して「lk」にします。「mn」はそのままです。
- 続く部分には3文字「opq」しか残っていません。これは num(2)以上・2 × num(4)未満なので、先頭の2文字「op」だけを反転して「po」とし、「q」はそのまま残します。
結果として「lkmnpoq」が得られます。
実装コード
この仕様を実現するコードは次のとおりです。
const str = 'klmnopq';
const num = 2;
const reverseString = (str = '', num = 1) => {
// 残りが num 文字未満なら全部反転
if(str.length < num){
return str.split("").reverse().join("");
};
let res = "";
// 2 * num 文字ずつ処理を進める
for(let i = 0; i < str.length; i += (2*num)){
// 先頭の num 文字を反転して連結
res += str.split("").slice(i, i+num).reverse().join("");
// 次の num 文字はそのまま連結
res += str.slice(i+num, i+2*num);
};
return res;
};
console.log(reverseString(str, num));
コードのポイント解説
この実装で押さえておきたいポイントは次の3つです。
- 早期リターンの活用: 文字列全体の長さが num 未満の場合は、要件上「すべて反転」すればよいため、
split()→reverse()→join()の一連の処理ですぐに結果を返しています。 - ステップ幅 2 × num のループ: ループ変数
iを 2 × num ずつ進めることで、各ブロックの先頭位置を正確に把握できます。 - 反転部分と維持部分の分離:
slice(i, i + num)で切り出した部分だけを反転し、slice(i + num, i + 2 * num)で取得した部分は加工せずに連結することで、要件どおりの出力を実現しています。
実行結果
コンソールに出力される結果は次のとおりです。
lkmnpoq
期待どおり、各ブロックの先頭 num 文字だけが反転された文字列が得られました。このように、配列操作系のメソッド(split・slice・reverse・join)を組み合わせることで、条件付きの文字列変換もシンプルに記述できます。
-
JavaScriptでアクセント付き文字を含む文字列を並べ替える方法
JavaScriptの標準的な sort() メソッドは、文字列をUnicodeコードポイントの順序に基づいて比較します。そのため、「é」や「ó」のようなアクセント付き文字を含む文字列を単純にソートすると、期待通りのアルファベット順にならないことがあります。この問題を解決するには、localeCompare() メソッドを使用します。このメソッドは、指定されたロケールの言語規則に従って文字列を比較できるため、アクセント付き文字も正しく並べ替えられます。localeCompare() の基本的な使い方以下は、スペイン語のアクセント付き文字を含む配列を localeCompare() を使ってソー
-
JavaScriptでテンプレート文字列をネストする方法
JavaScriptのES6で導入されたテンプレート文字列(テンプレートリテラル)は、バッククォート(`)で囲むことで文字列の中に変数や式を埋め込める便利な機能です。実は、この${}(プレースホルダー)の中に、さらに別のテンプレート文字列を入れ子(ネスト)として記述することもできます。テンプレート文字列のネストとは${}の中には任意のJavaScript式を書けるため、その中で再度バッククォートを使ったテンプレート文字列を評価することが可能です。これにより、関数呼び出しの引数として動的に生成した文字列を渡すなど、柔軟な文字列組み立てが行えます。コード例以下は、ボタンをクリックすると、ネストされ