두 개의 문자열 배열이 있다고 가정해 보겠습니다. 그중 하나의 배열을 알파벳순으로 정렬하려는데, 만약 이 배열 안에 다른 배열에도 포함된 단어들이 있다면 그 단어들은 맨 앞에 배치하고, 나머지 요소들만 알파벳순으로 정렬해야 합니다.
이를 위해 excludeSorting(arr, ex) 함수를 작성해 보겠습니다. 여기서 arr은 정렬 대상 배열이고, ex는 arr에 존재할 경우 맨 앞에 위치해야 하는 단어들의 배열입니다.
예제 코드
const arr = ['apple', 'cat', 'zebra', 'umbrella', 'disco', 'ball',
'lemon', 'kite', 'jack', 'nathan'];
const toBeExcluded = ['disco', 'zebra', 'umbrella', 'nathan'];
const excludeSort = (arr, ex) => {
arr.sort((a, b) => {
if(ex.includes(a)){
return -1;
}else if(ex.includes(b)){
return 1;
}
return a > b ? 1 : -1
});
};
excludeSort(arr, toBeExcluded);
console.log(arr);
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[
'nathan', 'disco',
'umbrella', 'zebra',
'apple', 'ball',
'cat', 'jack',
'kite', 'lemon'
]
동작 원리
핵심은 Array.prototype.sort()에 전달되는 비교 함수입니다. 비교 함수는 두 요소 a와 b를 인자로 받아 다음 규칙에 따라 순서를 결정합니다.
a가 제외 목록(ex)에 포함되어 있으면-1을 반환하여b보다 앞으로 보냅니다.b가 제외 목록에 포함되어 있으면1을 반환하여a를 뒤로 밀어냅니다.- 둘 다 제외 목록에 없다면 일반적인 문자열 비교(
a > b ? 1 : -1)를 통해 알파벳순으로 정렬합니다.
이러한 로직 덕분에 제외 목록에 있는 단어들은 자연스럽게 배열의 맨 앞으로 모이고, 나머지 요소들은 알파벳순으로 정렬됩니다. 참고로 sort()는 원본 배열을 직접 변경(mutate)한다는 점에 유의하세요. 원본 배열을 유지하고 싶다면 [...arr]처럼 스프레드 연산자로 복사본을 만든 뒤 정렬하는 것이 좋습니다.