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

JavaScriptで数字根(デジタルルート)に基づいて配列をソートする方法

数字根(デジタルルート)とは

数字根(デジタルルート)とは、正の整数を構成するすべての桁の数字を合計した値のことです。たとえば「13」であれば 1 + 3 = 4 となり、数字根は 4 になります。

本記事では、整数の配列を受け取り、次のルールに従って並べ替えるJavaScript関数を作成します。

  • 要素 a が b より先に来るのは、a の数字根が b の数字根以下である場合。
  • 数字根が同じ場合は、通常の大小関係において小さい方の数値を先に配置する。

たとえば、4 と 13 はどちらも数字根が「4」で等しいですが、4 < 13 であるため、両方を含む配列では常に 4 が 13 より先に並ぶことになります。

入力例と期待される出力

入力配列が次の場合 −

const arr = [13, 20, 7, 4];

出力は次のようになります −

const output = [20, 4, 13, 7];

この結果になる理由を確認してみましょう。各数値の数字根は以下の通りです。

  • 20 → 2 + 0 = 2
  • 4 → 4
  • 13 → 1 + 3 = 4
  • 7 → 7

数字根の昇順に並べると「20(2)→ 4・13(4)→ 7(7)」となります。4 と 13 は数字根が同一のため、数値として小さい 4 が先に配置されます。

サンプルコード

const arr = [13, 20, 7, 4];
const digitSum = (num, sum = 0) => {
   if(num){
      return digitSum(Math.floor(num / 10), sum + (num % 10));
   };
   return sum;
};
const digitalSort = (arr = []) => {
   const sorter = (a, b) => {
      return (digitSum(a) - digitSum(b)) || (a - b);
   };
   arr.sort(sorter);
};
digitalSort(arr);
console.log(arr);

コードの解説

  • digitSum 関数: 再帰的に自分自身を呼び出すことで各桁の合計を計算します。num % 10 で最下位の桁を取り出して加算し、Math.floor(num / 10) でその桁を除去した残りの数値を次の引数に渡します。num が 0 になった時点で、累積した合計 sum を返します。
  • digitalSort 関数: 配列の sort() メソッドに比較関数 sorter を渡しています。(digitSum(a) - digitSum(b)) || (a - b) という式により、まず数字根同士を比較し、その差が 0(つまり数字根が同じ)の場合には || 演算子の働きで後段の (a - b)、すなわち数値そのものの大小比較が行われます。

出力結果

このコードを実行すると、コンソールに次の出力が表示されます −

[ 20, 4, 13, 7 ]
  1. JavaScriptで2の平方根(√2)を取得する方法

    JavaScriptで2の平方根(√2)を取得するには、Mathオブジェクトが持つSQRT2プロパティを使用します。このプロパティは定数として定義されており、2の平方根である約 1.414 の値を返します。Math.SQRT2は読み取り専用の定数であり、自分で計算する必要がないため、コードの可読性と精度の両面でメリットがあります。サンプルコード以下のコードを実行すると、JavaScriptで2の平方根の値を取得して表示できます。<html>    <head>       <title>JavaScript

  2. JavaScriptの数値(Number)の基本と実践サンプルコード

    JavaScriptでは、整数も小数もすべて「Number」型として扱われます。この記事では、数値変数の定義方法と、それらを使った簡単な演算の例を、動作するHTMLサンプルコードとともに紹介します。サンプルコード以下は、JavaScriptで数値を扱う基本的な例です。整数(22、99)と小数(1.523)を変数に格納し、ボタンをクリックすると画面に表示する仕組みになっています。<!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport co