Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 고유 정렬(Unique Sort) 완벽 가이드: 중복 제거와 배열 정렬 동시에 처리하기

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(내림차순)를 인수로 전달해야 합니다.