JavaScriptで2次元配列を値ごとにグループ化して並べ替える方法
はじめに
本記事では、JavaScriptを使って2次元配列内の同じ数値をグループ化し、その結果を昇順に並べ替える方法を解説します。
まず、次のような数値の2次元配列があったとします。
const arr = [ [1, 3, 2], [5, 2, 1, 4], [2, 1] ];
ここで求められるのは、同じ数値どうしをそれぞれ独立したサブ配列にまとめ、さらにグループ化された配列全体を昇順に並べ替えるJavaScript関数です。
最終的に、新しい配列は次のようになります。
const output = [ [1, 1, 1], [2, 2, 2], [3], [4], [5] ];
実装コード
この処理を実現するコードは以下のとおりです。
const arr = [
[1, 3, 2],
[5, 2, 1, 4],
[2, 1]
];
const groupAndSort = arr => {
const res = [];
const map = Object.create(null);
Array.prototype.forEach.call(arr, item => {
item.forEach(el => {
if (!(el in map)) {
map[el] = [];
res.push(map[el]);
};
map[el].push(el);
});
});
res.sort((a, b) => {
return a[0] - b[0];
});
return res;
};
console.log(groupAndSort(arr));出力結果
コンソールには次のように出力されます。
[ [ 1, 1, 1 ], [ 2, 2, 2 ], [ 3 ], [ 4 ], [ 5 ] ]
コードの解説
この実装のポイントを順番に見ていきましょう。
1. マップの作成: Object.create(null) を使うことで、プロトタイプチェーンを持たないプレーンなオブジェクトを生成しています。これにより、toString などの組み込みプロパティ名と衝突するリスクを回避できます。
2. グループ化: 外側の forEach で各サブ配列を、内側の forEach で各要素を走査します。初めて登場する値の場合は、新しい空のサブ配列を作成し、結果配列 res に登録します。以降、同じ値が出現するたびに、対応するサブ配列へその値を追加していきます。
3. 並べ替え: グループ化が完了したら、sort() メソッドのコールバックで各サブ配列の先頭要素(=グループを代表する値)同士を比較し、配列全体を昇順に整列させます。
このように、マップによる値の出現管理とソート処理を組み合わせることで、シンプルかつ効率的にグループ化と並べ替えを実現できます。
-
JavaScriptで配列を降順に並べ替えて隣接要素の差の合計を求める方法
問題 整数の配列を受け取るJavaScript関数を作成する必要があります。この関数は、配列を降順に並べ替えたうえで、隣り合う要素同士の差を順番に足し合わせ、その合計値を返すものです。 たとえば、次のような配列が渡された場合を考えてみましょう。 [6, 2, 15] この場合、期待される出力は次のとおりです。 (15 - 6) + (6 - 2) = 13 解決のアプローチ この問題は、以下の手順でシンプルに解くことができます。 sort()メソッドを使い、配列を降順(大きい順)に並べ替える。 隣接する2つの要素(i番目と i + 1 番目)の差を計算し、合計に加算していく。 配列の要素
-
JavaScriptで2次元配列を指定した行数・列数に再形成する方法
問題JavaScriptの関数を作成します。この関数は、第1引数として数値の2次元配列 arr を受け取り、続く2つの引数として、変換後の行列の行数と列数を表す数値 r および c を受け取ります。関数は、入力配列と同じ行優先(row-traversing)順序で要素を並べ替えたうえで、指定された行数と列数を持つ新しい2次元配列を生成して返す必要があります。たとえば、関数への入力が次の場合:const arr = [ [6, 7], [8, 9] ]; const r = 1, c = 4;期待される出力は次のとおりです。const output = [[6, 7, 8, 9]];出力