숫자 리터럴과 문자열 리터럴이 섞여 있는 배열이 주어졌을 때, 두 데이터 타입을 분리하면서 동시에 각 타입 내부에서도 정렬이 이루어지도록 만들어야 하는 경우가 있습니다.
이 문제는 Array.prototype.sort() 메서드에 사용자 정의 비교 함수(comparator)를 전달하는 방식으로 깔끔하게 해결할 수 있습니다. 비교 함수는 아래와 같은 규칙에 따라 동작합니다.
- 두 요소가 모두 숫자인 경우 →
a - b를 반환하여 오름차순으로 정렬 - 첫 번째 요소만 숫자인 경우 →
-1을 반환하여 숫자를 앞쪽에 배치 - 두 번째 요소만 숫자인 경우 →
1을 반환하여 문자열을 뒤쪽에 배치 - 두 요소가 모두 문자열인 경우 → 대소 비교를 통해 사전순(알파벳순)으로 정렬
예제 코드
const arr = [1, 5, 'fd', 6, 'as', 'a', 'cx', 43, 's', 51, 7];
const sorter = (a, b) => {
const first = typeof a === 'number';
const second = typeof b === 'number';
if(first && second){
return a - b;
}else if(first && !second){
return -1;
}else if(!first && second){
return 1;
}else{
return a > b ? 1 : -1;
}
};
arr.sort(sorter);
console.log(arr);
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[
1, 5, 6, 7,
43, 51, 'a', 'as',
'cx', 'fd', 's'
]
실행 결과를 보면 숫자들이 먼저 오름차순으로 정렬되고, 그 뒤에 문자열들이 알파벳 순으로 정렬된 것을 확인할 수 있습니다. 핵심은 typeof 연산자로 각 요소의 타입을 판별한 뒤, 비교 함수 안에서 타입별 우선순위를 지정하는 것입니다. 이 방식을 응용하면 불린 값이나 객체 등 다른 타입이 섞인 배열도 원하는 기준대로 자유롭게 정렬할 수 있습니다.