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

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() メソッドのコールバックで各サブ配列の先頭要素(=グループを代表する値)同士を比較し、配列全体を昇順に整列させます。

このように、マップによる値の出現管理とソート処理を組み合わせることで、シンプルかつ効率的にグループ化と並べ替えを実現できます。

  1. JavaScriptで配列を降順に並べ替えて隣接要素の差の合計を求める方法

    問題 整数の配列を受け取るJavaScript関数を作成する必要があります。この関数は、配列を降順に並べ替えたうえで、隣り合う要素同士の差を順番に足し合わせ、その合計値を返すものです。 たとえば、次のような配列が渡された場合を考えてみましょう。 [6, 2, 15] この場合、期待される出力は次のとおりです。 (15 - 6) + (6 - 2) = 13 解決のアプローチ この問題は、以下の手順でシンプルに解くことができます。 sort()メソッドを使い、配列を降順(大きい順)に並べ替える。 隣接する2つの要素(i番目と i + 1 番目)の差を計算し、合計に加算していく。 配列の要素

  2. 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]];出力