JavaScriptで文字列のすべての文字を次の文字に変換する方法
はじめに
今回は、文字列を受け取り、その中のすべての英字をアルファベット上で一つ後ろの文字に置き換えるJavaScript関数を作成します。
例えば、次のような文字列が与えられた場合を考えてみましょう。
const str = 'how are you';
この場合、期待される出力は以下の通りです。
const output = 'ipx bsf zpv';
この処理を実装するうえでのポイントは次の2点です。
- スペースや記号など、英字以外の文字はそのまま維持する
- 'z'(または 'Z')のときは 'a'(または 'A')へ循環(ローテーション)させる
実装コード
以下が実際のコード例です。
const str = 'how are you';
const isAlpha = code => (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
const isLast = code => code === 90 || code === 122;
const nextLetterString = str => {
const strArr = str.split('');
return strArr.reduce((acc, val) => {
const code = val.charCodeAt(0);
if(!isAlpha(code)){
return acc+val;
};
if(isLast(code)){
return acc+String.fromCharCode(code-25);
};
return acc+String.fromCharCode(code+1);
}, '');
};
console.log(nextLetterString(str));
コードの解説
処理の流れを順番に見ていきましょう。
isAlpha: 文字コードが英字(大文字A〜Zは65〜90、小文字a〜zは97〜122)の範囲内かどうかを判定するヘルパー関数です。isLast: 文字が 'Z'(90)または 'z'(122)であるか、つまりアルファベットの末尾かどうかを判定します。nextLetterString: メインの処理です。split('')で文字列を1文字ずつの配列に分解し、reduceを使って各文字を走査します。
走査の内部では、まず charCodeAt(0) で文字コードを取得し、英字でなければそのまま連結、アルファベットの末尾ならコードを25減らして先頭の文字に戻し、それ以外のコードは1増やすことで「次の文字」を生成しています。String.fromCharCode() を使えば、数値の文字コードから対応する文字を復元できます。
出力結果
コンソールには以下のように表示されます。
ipx bsf zpv
このように、シーザー暗号のシフト量を1とした場合と同じ考え方で、文字列内のすべての英字を簡単に次の文字へ変換することができます。シフト量を引数化すれば、任意の数だけずらす暗号化処理にも応用可能です。
-
【JavaScript】ページ内のすべてのリンクの座標を取得する方法
JavaScriptを使えば、Webページ内にあるすべてのリンク(<a>タグ)の位置やサイズに関する情報を簡単に取得できます。この記事では、ボタンをクリックすると各リンクの座標情報を一覧で表示するサンプルコードをわかりやすく解説します。サンプルコード以下は、ページ内のすべてのリンクの座標を取得して表示するHTMLとJavaScriptのコード例です。<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta
-
JavaScriptの匿名ラッパー関数(IIFE)とは?使い方を徹底解説
匿名ラッパー関数(Anonymous Wrapper Function)は、コードスニペットやJavaScriptライブラリ、個々の関数などを包み込むために使われる手法です。コードの可視性や名前空間(namespace)を制御することで、他のライブラリや外部スクリプトとの名前の衝突・競合を防ぐことができます。 この目的のために広く利用されているのが、IIFE(即時実行関数式:Immediately Invoked Function Expressions)です。IIFEは定義されたその場で即座に実行される関数式であり、関数内部で宣言された変数は外部からアクセスできないため、グローバル名前空間を