JavaScriptで配列から重複を削除して並べ替える「ユニークソート」の実装方法
配列から重複する要素を取り除き、同時に並べ替えを行うテクニックは、一般的にユニークソート(一意の並べ替え)と呼ばれます。
たとえば、次のような入力配列があった場合を考えてみましょう。
const arr = [1, 1, 1, 3, 2, 2, 8, 3, 4];
この場合、重複が削除され、昇順に並べ替えられた出力は次のようになります。
const output = [1, 2, 3, 4, 8];
オブジェクトを使ったユニークソートの実装例
ここでは、オブジェクト(連想配列)をマップとして利用し、すでに処理済みの値を記録することで重複を判定する方法を紹介します。
コードは以下の通りです。
const arr = [1, 1, 1, 3, 2, 2, 8, 3, 4];
const uniqSort = (arr = []) => {
const map = {};
const res = [];
for (let i = 0; i < arr.length; i++) {
if (!map[arr[i]]) {
map[arr[i]] = true;
res.push(arr[i]);
}
}
return res.sort((a, b) => a - b);
};
console.log(uniqSort(arr));処理の流れ
このコードの動作を簡単に解説します。
- 空のオブジェクト
mapと、結果を格納する配列resを用意します。 - 配列の要素を先頭から順番に走査し、その値が
mapに存在しない場合のみ、mapにフラグを立ててresへ追加します。 - 最後に
sort()メソッドと比較関数(a, b) => a - bを使って、数値として正しく昇順ソートを行います。
実行結果
コンソールには次のように出力されます。
[ 1, 2, 3, 4, 8 ]
補足:Set を使ったより簡潔な方法
ES2015以降では、Set オブジェクトを利用すると、同じ処理をさらに簡潔に書くことができます。
const uniqSort = (arr = []) => [...new Set(arr)].sort((a, b) => a - b); console.log(uniqSort([1, 1, 1, 3, 2, 2, 8, 3, 4])); // [ 1, 2, 3, 4, 8 ]
Set は自動的に重複のない値のコレクションを作成するため、スプレッド構文 [...] で展開して配列に戻し、そのままソートするだけでユニークソートが完成します。どちらの方法でも計算量は O(n log n) 程度となり、実用上十分なパフォーマンスが得られます。
-
JavaScriptで「月-年」(MM-YYYY)形式の配列を古い順に並べ替える方法
問題の概要 JavaScriptでは、「月-年」(MM-YYYY) 形式の日付文字列を格納した配列を、古い日付から新しい日付へと並べ替えたいケースがあります。たとえば、次のような配列を考えてみましょう。 const arr = ["1-2016", "7-2015", "7-2016", "3-2016", "8-2016", "2-2016", "6-2016", "8-2015", "5-2016", &quo
-
JavaScriptで配列内の各要素の出現回数が一意かどうかを判定する方法
本記事では、整数の配列を第1引数(唯一の引数)として受け取り、配列内に存在するすべての整数の出現回数が一意(ユニーク)であるかどうかを判定するJavaScript関数を作成します。問題の概要この関数は、配列内の各要素が出現する回数が互いに異なる場合には true を返し、同じ出現回数を持つ要素がひとつでも存在する場合には false を返す必要があります。入力例const arr = [7, 5, 5, 8, 2, 4, 7];出力例const output = false;この場合の出力が false になる理由は、整数 7 と 5 の両方が2回ずつ出現しており、出現回数が重複しているためで