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

【JavaScript】数値の重み(桁の合計)に基づいて配列をソートする方法

数値の「重み」とは?

数値の重み(weight)とは、その数値を構成する各桁の数字をすべて足し合わせた合計のことです。具体例を見てみましょう。

100 の重み → 1 + 0 + 0 = 1
22 の重み → 2 + 2 = 4
99 の重み → 9 + 9 = 18
123 の重み → 1 + 2 + 3 = 6

実現したいこと

今回作成するのは、数値の配列を受け取り、各数値の重みが小さい順(昇順)に並べ替えるJavaScript関数です。さらに、2つの数値の重みが同じだった場合には、数値そのものの昇順で並ぶようにします。

たとえば、50 と 23 はどちらも重みが 5 で等しいため、このケースでは数値として小さい 23 を先に配置することになります。

サンプルコード

以下がその実装例です。

const arr = [2, 1, 100, 56, 78, 3, 66, 99, 200, 46];
const calculateWeight = (num, sum = 0) => {
   if(num){
      return calculateWeight(Math.floor(num / 10), sum + (num % 10));
   };
   return sum;
};
const sorter = (a, b) => {
   return calculateWeight(a) - calculateWeight(b) || a - b;
}
arr.sort(sorter);
console.log(arr);

出力結果

コンソールには次のように表示されます。

[
   1, 100, 2, 200, 3,
   46, 56, 66, 78, 99
]

コードの解説

calculateWeight 関数は再帰的に動作します。引数の数値を10で割った余り(最下位の桁)を合計に加算しながら、商を次の呼び出しに渡していくことで、すべての桁の合計=重みを求めています。

比較関数 sorter では、まず2つの数値の重みを比較します。ここでポイントとなるのが || 演算子の使い方です。重みの差が 0(つまり重みが等しい)の場合のみ、右辺の a - b が評価され、実際の数値の昇順で並べ替えられます。このように書くことで、「重み優先・同点なら数値順」という条件を1行で簡潔に表現できます。

  1. JavaScriptのMath.min()関数の使い方をわかりやすく解説

    Mathオブジェクトのmin()関数は、複数の数値を受け取り、その中で最も小さい値(最小値)を返します。引数として1つの数値のみを渡した場合、その値がそのまま返されます。引数を1つも渡さなかった場合は、Infinity(無限大)が返されます。構文Math.min()関数の基本的な構文は以下のとおりです。Math.min(48, 148, 3654);サンプルコード実際にMath.min()関数を使用して、複数の数値の中から最小値を取得する例を見てみましょう。<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