JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで特定のルールに従って文字列を反転する方法

問題の概要

今回は、文字列 str を第一引数、整数 num を第二引数として受け取るJavaScript関数を作成します。

この関数が満たすべき要件は以下のとおりです。

  • 基本ルール: 文字列の先頭から数えて 2 × num 文字ごとのブロックに着目し、各ブロックの最初の num 文字だけを反転させる。残りの部分は元の順序のまま維持する。
  • 残りが num 文字未満の場合: 残った文字をすべて反転する。
  • 残りが num 文字以上・2 × num 文字未満の場合: 最初の num 文字のみを反転し、残りはそのまま出力する。

具体例で確認する

たとえば、入力として次のような文字列と数値が与えられたとします。

const str = 'klmnopq';
const num = 2;

このとき、期待される出力は次のようになります。

const output = 'lkmnpoq';

処理の流れを追ってみましょう。

  1. 最初の4文字(2 × num = 4)である「klmn」に注目し、先頭の2文字「kl」を反転して「lk」にします。「mn」はそのままです。
  2. 続く部分には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 文字だけが反転された文字列が得られました。このように、配列操作系のメソッド(splitslicereversejoin)を組み合わせることで、条件付きの文字列変換もシンプルに記述できます。

  1. JavaScriptでアクセント付き文字を含む文字列を並べ替える方法

    JavaScriptの標準的な sort() メソッドは、文字列をUnicodeコードポイントの順序に基づいて比較します。そのため、「é」や「ó」のようなアクセント付き文字を含む文字列を単純にソートすると、期待通りのアルファベット順にならないことがあります。この問題を解決するには、localeCompare() メソッドを使用します。このメソッドは、指定されたロケールの言語規則に従って文字列を比較できるため、アクセント付き文字も正しく並べ替えられます。localeCompare() の基本的な使い方以下は、スペイン語のアクセント付き文字を含む配列を localeCompare() を使ってソー

  2. JavaScriptでテンプレート文字列をネストする方法

    JavaScriptのES6で導入されたテンプレート文字列(テンプレートリテラル)は、バッククォート(`)で囲むことで文字列の中に変数や式を埋め込める便利な機能です。実は、この${}(プレースホルダー)の中に、さらに別のテンプレート文字列を入れ子(ネスト)として記述することもできます。テンプレート文字列のネストとは${}の中には任意のJavaScript式を書けるため、その中で再度バッククォートを使ったテンプレート文字列を評価することが可能です。これにより、関数呼び出しの引数として動的に生成した文字列を渡すなど、柔軟な文字列組み立てが行えます。コード例以下は、ボタンをクリックすると、ネストされ