JavaScript의 고유 정렬(Unique Sort)이란?
배열에서 중복된 값을 제거하는 작업과 오름차순 정렬 작업을 한 번에 처리하는 프로그래밍 기법을 흔히 고유 정렬(Unique Sort)이라고 부릅니다. 실무에서 데이터를 정리할 때 자주 사용되는 패턴입니다.
예를 들어 다음과 같은 입력 배열이 있다고 가정해 보겠습니다.
const arr = [1, 1, 1, 3, 2, 2, 8, 3, 4];
중복을 제거하고 정렬한 뒤 기대되는 출력 결과는 다음과 같습니다.
const output = [1, 2, 3, 4, 8];
구현 예제: 객체(Map)를 활용한 방법
아래 코드는 객체를 활용해 이미 등장한 값인지 확인하고, 처음 나타난 값만 결과 배열에 추가한 후 마지막에 오름차순으로 정렬하는 방식입니다.
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객체에 해당 값이 존재하지 않으면(!map[arr[i]]) 아직 등장하지 않은 값입니다.- 값을
true로 기록하여 중복 여부를 표시하고, 결과 배열res에 추가합니다. - 반복이 끝나면
sort()와 비교 함수(a, b) => a - b를 사용해 숫자를 오름차순으로 정렬합니다.
실행 결과
콘솔에는 다음과 같은 결과가 출력됩니다.
[ 1, 2, 3, 4, 8 ]
더 간결한 방법: ES6 Set 활용하기
ES6에서 도입된 Set 객체를 사용하면 위 로직을 한 줄로 압축할 수 있습니다. 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 ]
new Set(arr)로 중복을 제거한 뒤 스프레드 연산자(...)로 다시 배열로 변환하고, sort()로 정렬하는 방식입니다. 코드가 짧아질 뿐 아니라 가독성도 크게 향상됩니다.
주의 사항: sort()의 기본 동작
Array.prototype.sort()는 기본적으로 배열 요소를 문자열로 변환한 후 유니코드 순서로 비교합니다. 따라서 [10, 2, 1]처럼 두 자리 숫자가 섞인 배열을 그냥 정렬하면 [1, 10, 2]라는 잘못된 결과가 나올 수 있습니다.
숫자 배열을 정확하게 정렬하려면 반드시 비교 함수 (a, b) => a - b(오름차순) 또는 (a, b) => b - a(내림차순)를 인수로 전달해야 합니다.