문제 개요
첫 번째 인수로 리터럴 값들로 이루어진 배열을, 두 번째 인수로 문자열을 받는 JavaScript 함수를 작성해야 합니다.
이 함수는 배열을 알파벳 순으로 정렬하되, 두 번째 인수로 전달된 문자열이 배열 안에 존재하는 경우에는 그 내용과 무관하게 해당 요소를 반드시 첫 번째 위치에 배치해야 합니다.
예제 코드
구현 코드는 다음과 같습니다.
const arr = ["Apple", "Orange", "Grapes", "Pineapple", "None", "Dates"];
const sortKeepingConstants = (arr = [], text = '') => {
const sorter = (a, b) => {
return (b === text) - (a === text) || a.localeCompare(b);
}
arr.sort(sorter);
};
sortKeepingConstants(arr, 'None');
console.log(arr);코드 설명
이 코드의 핵심은 Array.prototype.sort()에 전달되는 비교 함수 sorter입니다.
(b === text) - (a === text) 부분이 우선순위를 결정합니다. 불린 값은 산술 연산에서 각각 1과 0으로 변환되므로, b가 지정된 문자열과 일치하면 양수가 되어 b가 앞으로 정렬됩니다. 즉, 지정된 문자열이 비교 대상으로 등장하면 항상 앞쪽으로 밀어내는 역할을 합니다.
두 요소 모두 지정된 문자열이 아니라면 이 표현식은 0이 되고, 이때 논리 OR(||) 연산자에 의해 a.localeCompare(b)가 실행되어 일반적인 알파벳 순 정렬이 수행됩니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ 'None', 'Apple', 'Dates', 'Grapes', 'Orange', 'Pineapple' ]
결과를 보면 'None'이 알파벳 순서와 무관하게 배열의 맨 앞에 배치되고, 나머지 요소들은 알파벳 순으로 깔끔하게 정렬된 것을 확인할 수 있습니다.