JavaScriptで桁数が偶数の数値を配列から抽出する方法
本記事では、数値の配列を唯一の引数として受け取るJavaScript関数を作成する方法を解説します。
この関数の役割は、配列の中から「桁数が偶数」である要素をすべて取り出し、それらを新しい配列として返すことです。
具体例
たとえば、次のような入力配列が与えられたとします。
const arr = [34, 23, 112, 8, 3456, 345];
この場合、期待される出力は以下のとおりです。
const output = [34, 23, 3456];
「34」と「23」は2桁、「3456」は4桁なので偶数桁の条件を満たします。一方、「112」「8」「345」はそれぞれ3桁・1桁・3桁のため、結果から除外されます。
コード例
const arr = [34, 23, 112, 8, 3456, 345];
const countDigits = (num, sum = 0) => {
if(num){
return countDigits(Math.floor(num / 10), sum + 1);
};
return sum;
};
const isEven = num => num % 2 === 0;
const returnEvens = (arr = []) => {
const res = arr.filter(el => isEven(countDigits(el)));
return res;
};
console.log(returnEvens(arr));コードの解説
ここで使われている各関数の仕組みを順番に見ていきましょう。
countDigits関数
countDigitsは再帰呼び出しを利用して桁数を数える関数です。数値を10で割り、Math.floorで小数点以下を切り捨てる操作を繰り返すことで、数字が1桁ずつ減っていきます。数値が0になった時点で、そこまで加算してきたsum、つまり桁数を返します。
isEven関数
isEvenは、受け取った数値を2で割った余りが0かどうかを判定するシンプルな関数です。余りが0なら偶数、それ以外なら奇数と判断できます。
returnEvens関数
returnEvensは配列のfilterメソッドを使い、各要素に対してcountDigitsで桁数を求め、その桁数がisEvenによって偶数かどうかを判定しています。条件を満たす要素だけが残り、結果として新しい配列が生成されます。
別のアプローチ:文字列変換で桁数を取得する
再帰を使わなくても、数値を文字列に変換してlengthプロパティを参照すれば、より簡潔に桁数を取得できます。
const returnEvens = (arr = []) => arr.filter(el => String(Math.abs(el)).length % 2 === 0); console.log(returnEvens(arr)); // [34, 23, 3456]
コード量が少なく読みやすいため、実務ではこちらの手法が好まれることも多いです。ただし、負の数を扱う場合はマイナス記号が文字数に含まれてしまうため、上記のようにMath.abs()で絶対値に変換しておくのが安全です。また、どちらの方法も小数や極端に大きな数値は想定外の動作になる可能性があるため、整数を対象とする用途に向いています。
実行結果
コンソールには次のように出力されます。
[34, 23, 3456]
-
JavaScriptで数値を逆順の桁配列に変換する方法
問題の概要負でない整数が与えられたとき、その各桁を独立した要素として含み、逆順に並べた配列を返す関数を作成する必要があります。例348597 => [7, 9, 5, 8, 4, 3]このように、元の数値の下の桁から順に並んだ配列が出力されれば正解です。実装コード(forループを使用)const num = 348597; const reverseArrify = num => { const numArr = String(num).split(); const reversed =
-
JavaScriptで数値の各桁の数字を一つずつ分割表示する方法
はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html> <head> &n