JavaScriptで配列をソートし、重複する数値ごとにサブ配列へグループ化する方法
JavaScriptでは、数値の配列を唯一の引数として受け取る関数を作成することが求められるケースがあります。この入力配列には、同一の値(重複した要素)が含まれている可能性があります。
ここで作成する関数は、配列を昇順に並べ替えたうえで、すべての同一の数値をそれぞれ独立したサブ配列にグループ分けして返す必要があります。
例
たとえば、入力配列が次のような場合 −
const arr = [5, 7, 5, 7, 8, 9, 1, 1];
期待される出力は以下のとおりです −
const output = [ [1, 1], [5, 5], [7, 7], [8], [9] ];
実装コード
この処理を実現するコードは次のようになります −
const arr = [5, 7, 5, 7, 8, 9, 1, 1];
const sortAndGroup = (arr = []) => {
let result = [];
let groupArray;
arr.sort((a, b) => a - b);
for (let i = 0; i < arr.length; i++) {
if (arr[i - 1] !== arr[i]) {
groupArray = [];
result.push(groupArray);
};
groupArray.push(arr[i]);
};
return result;
};
console.log(sortAndGroup(arr));出力結果
コンソールには次のように表示されます −
[ [ 1, 1 ], [ 5, 5 ], [ 7, 7 ], [ 8 ], [ 9 ] ]
コードの解説
このアルゴリズムの仕組みはシンプルです。まず sort() メソッドと比較関数 (a, b) => a - b を使って、配列を数値として正しく昇順に並べ替えます。
続いてループ処理の中で、現在の要素 arr[i] と直前の要素 arr[i - 1] を比較します。値が異なる場合は新しい空のサブ配列を作成し、結果配列に追加します。値が同じであれば、現在開いているサブ配列にそのまま要素を追加していきます。
この方法なら、ソート部分が O(n log n)、グループ化部分が O(n) となり、全体として効率的に処理できます。また、アロー関数とデフォルト引数を使用することで、簡潔で安全な実装になっています。
-
JavaScriptで有理数(分数)の配列を合計し、最も簡単な形式で結果を返す方法
問題 「2つの数値を持つ部分配列」をちょうど2つ含む配列を受け取るJavaScript関数を作成する必要があります。各部分配列は、分数形式で表された有理数です。 この関数の役割は、2つの有理数を加算し、その結果を最も簡単な形式(最簡形)で表す2つの数値からなる新しい配列として返すことです。 解法のアプローチ 分数の加算は、以下の手順で行います。 通分する: 2つの分母を掛け合わせて共通の分母を求め、それに合わせて分子も調整します。 分子を加算する: 通分後の分子同士を足し合わせます。 約分する: 最大公約数(GCD)をユークリッドの互除法で求め、分子・分母をそれぞれ割ることで最簡形にしま
-
JavaScriptで配列内のすべてのピーク(局所最大値)とその位置を検出する方法
データ分析や信号処理の現場では、数値の配列の中から「山」にあたる部分、つまり局所最大値(ピーク)とその位置を特定したい場面がよくあります。本記事では、JavaScriptを使って配列内のすべてのピークと、そのインデックス位置を効率的に検出する方法を解説します。 前提となる例 まず、次のようなJavaScriptの配列を用意します。 const arr = [4, 3, 4, 7, 5, 2, 3, 4, 3, 2, 3, 4]; この配列の各要素をY軸の値としてプロットし、隣り合う要素同士をX軸上で等間隔(単位距離)に配置すると、グラフは以下のようになります。 グラフを見ると分かるように、こ