JavaScriptで文字列内のすべての数字を抽出して合計する方法
問題の概要
JavaScriptで、英字や記号などが混在する文字列を受け取り、その中に含まれる1桁の数字をすべて合計して返す関数を作成することを考えます。
たとえば「uyyudfgdfgf5jgdfj3hbj4...」のような文字列が与えられた場合、関数は文字列中に出現する数字(5, 3, 4...)だけを拾い出し、それらの総和を計算して返す必要があります。
実装例
const str = 'uyyudfgdfgf5jgdfj3hbj4hbj3jbb4bbjj3jb5bjjb5bj3';
const sumNum = str => {
const strArr = str.split("");
let res = 0;
for(let i = 0; i < strArr.length; i++){
if(+strArr[i]){
res += +strArr[i];
};
};
return res;
};
console.log(sumNum(str));
出力結果
コンソールには以下のように出力されます。
35
コードの解説
このコードの処理の流れは次のとおりです。
1. 文字列を1文字ずつに分解する: split("") を使うことで、文字列を空文字列で区切り、1文字ずつの要素を持つ配列に変換できます。
2. 数値への変換と判定: 単項プラス演算子(+)を各文字に適用すると、数字の文字は対応する数値に変換され、数字以外の文字は NaN(Not a Number)になります。if文の条件式では NaN や 0 は偽(false)と評価されるため、数字以外の文字は自動的に除外されます。
補足: 数字の「0」も偽と評価されてスキップされますが、合計に0を加えても結果は変わらないため、この実装でも正しく動作します。
正規表現を使ったより簡潔な方法
match() メソッドと reduce() を組み合わせると、同じ処理をさらに短く書くことができます。
const sumNum = str => {
const nums = str.match(/\d/g) || [];
return nums.reduce((sum, n) => sum + +n, 0);
};/\d/g は「1桁の数字」にマッチする正規表現です。match() により数字のみを配列として取り出し、reduce() でその合計を一気に計算しています。ループ処理を自分で書く必要がないため、可読性が高くおすすめの書き方です。
-
JavaScriptでスペース区切りの文字列内の数値を合計する方法
問題スペースで区切られた整数を含む文字列を受け取り、その中の各整数を数値に変換したうえで、合計値を返すJavaScript関数を作成する必要があります。解決のアプローチ基本的な処理の流れは次の3ステップです。split( ) メソッドで、文字列をスペースを基準に配列へ分割するmap(Number) で、配列の各要素を数値へ変換するreduce() を使って、配列内のすべての数値を合計するコード例以下が実際のコードです。const str = 1 5 12 76 2; { { acc + val); r
-
JavaScriptでスペースの位置を維持したまま文字列を反転させる方法
問題空白(スペース)を含む可能性のある文字列を受け取り、各単語の文字順だけを反転させるJavaScript関数を作成することを考えます。求められる条件は次のとおりです。単語内部の文字は逆順に並べ替える単語と単語を区切るスペースの位置は元のまま維持する異なる単語の文字同士が入れ替わらないようにするアプローチ基本となるアイデアは、「元の文字列を末尾から先頭へ向かって走査し、空白以外の文字を結果用の文字列へ追加していく」というものです。文字を追加するたびに、結果文字列の現在の長さをインデックスとして元の文字列を参照し、その位置がスペースであれば同じくスペースを結果に加えます。こうすることで、スペース