자바스크립트의 sort 함수는 배열의 요소들을 정렬하는 함수입니다. 기본적으로는 오름차순으로 정렬되며, 내림차순으로 정렬하려면 compareFunction 인자에 음수를 반환하는 함수를 전달하면 됩니다.
sort 함수는 배열의 요소들을 순회하면서 인접한 두 요소를 비교하여 더 작은 요소를 앞쪽으로 이동시킴으로써 정렬을 수행합니다. 이때 비교 기준은 기본적으로 문자열의 유니코드 코드 포인트를 따릅니다.
따라서, 문자열을 정렬할 때는 문제가 없지만, 숫자를 정렬할 때는 예상과 다른 결과가 나올 수 있습니다. 예를 들어, 다음과 같은 코드를 실행하면 다음과 같은 결과가 나옵니다.
const numbers = [1, 2, 3];
numbers.sort();
console.log(numbers); // ['1', '2', '3']
이는 sort 함수가 숫자를 문자열로 변환하여 비교하기 때문입니다. 따라서, 숫자를 정렬하려면 compareFunction 인자에 직접 대소비교를 수행하는 함수를 전달해야 합니다. 예를 들어, 다음과 같은 코드를 실행하면 다음과 같은 결과가 나옵니다.
const numbers = [1, 2, 3];
numbers.sort((a, b) => a - b);
console.log(numbers); // [1, 2, 3]
이 코드에서는 compareFunction 인자에 a - b를 전달하여 두 숫자를 직접 비교합니다. 따라서, 위 코드의 결과는 예상한 대로 [1, 2, 3]이 됩니다.
a - b를 사용하면 숫자를 오름차순으로 정렬할 수 있습니다. 내림차순으로 정렬하려면 b - a를 사용하면 됩니다.
또한, sort 함수는 stable sort가 아닙니다. stable sort란, 정렬 과정에서 요소들의 상대적 순서가 유지되는 정렬 방식입니다. 예를 들어, 다음과 같은 코드를 실행하면 다음과 같은 결과가 나옵니다.
const strings = ["a", "b", "c"];
strings.sort();
console.log(strings); // ["a", "b", "c"]
이 코드에서는 문자열을 오름차순으로 정렬합니다. 하지만, "a"와 "b"가 같은 문자열이므로, 정렬 과정에서 두 요소의 순서가 변경될 수 있습니다.
stable sort를 수행하려면, sort 함수의 compareFunction 인자에 stable sort를 지원하는 함수를 전달해야 합니다. 예를 들어, 다음과 같은 코드를 실행하면 다음과 같은 결과가 나옵니다.
const strings = ["a", "b", "c"];
strings.sort((a, b) => {
if (a === b) {
return 0;
} else {
return a < b ? -1 : 1;
}
});
console.log(strings); // ["a", "b", "c"]
이 코드에서는 compareFunction 인자에 다음과 같은 함수를 전달합니다.
function compare(a, b) {
if (a === b) {
return 0;
} else {
return a < b ? -1 : 1;
}
}
이 함수는 두 문자열이 같은 경우 0을 반환하고, 그렇지 않은 경우 두 문자열의 유니코드 코드 포인트의 차이를 반환합니다. 따라서, 이 함수를 사용하면 "a"와 "b"가 같은 문자열이더라도, 정렬 과정에서 두 요소의 순서가 변경되지 않습니다.
자바스크립트의 sort 함수는 다양한 기능을 제공하는 유용한 함수입니다. 하지만, 기본적으로 문자열로 변환하여 비교하기 때문에, 숫자나 다른 타입의 값을 정렬할 때는 compareFunction 인자에 직접 대소비교를 수행하는 함수를 전달해야 합니다. 또한, stable sort를 수행하려면 stable sort를 지원하는 함수를 compareFunction 인자에 전달해야 합니다.
* 해당 게시글은 Bard가 작성한 것임을 알립니다.