array.sort() 메소드는 단순히 배열 안의 요소를 숫자의 크기 순서대로 혹은 그 반대의 순서대로 정렬하는 용도로 사용했다. 그런데 알고리즘 문제를 풀면서 문자열을 정렬해야 하는 상황이 있어 다시한번 찾아보게 되었다.
sort()
메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다.
const month = ['March', 'Jan', 'Feb', 'Dec'];
month.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]
sort() 메서드의 인자로 들어가는 콜백함수 compareFunction 이 제공되지 않으면 요소를 문자열로 변환하고 유니 코드 코드포인트 순서로 문자열을 비교하여 정렬됩니다. 예를 들어 '바나나' 는 '체리' 앞에 옵니다. 숫자 정렬에서는 9 가 80 보다 앞에오지만 숫자는 문자열로 변환되기 때문에 '80' 은 유니 코드 순서에서 '9' 앞에 옵니다.
compareFunction
이 제공되면 배열 요소는 compare 함수의 반환 값에 따라 정렬됩니다. a와 b가 비교되는 두 요소라면,
compareFunction(a, b)
이 0보다 작을 경우 a 를 b 보다 낮은 인덱스로 정렬합니다. 즉, a 가 먼저 옵니다.compareFunction(a, b)
이 0을 반환하면 a 와 b 를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다.compareFunction(a, b)
이 0보다 큰 경우, b 를 a 보다 낮은 인덱스로 정렬합니다.compareFunction(a, b)
은 요소 a와 b의 특정 쌍이 두 개의 인자로 주어질 때 항상 동일한 값을 반환해야 합니다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않습니다.예시 1
let numbers = [4, 2, 5, 1, 3];
numbers.sort((a, b) => a - b);
// [1, 2, 3, 4, 5]
예시 2
var items = [
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic', value: 13 },
{ name: 'Zeros', value: 37 }
];
// value 기준으로 정렬
items.sort(function (a, b) {
if (a.value > b.value) {
return 1;
}
if (a.value < b.value) {
return -1;
}
// a must be equal to b
return 0;
});
// name 기준으로 정렬
items.sort(function(a, b) {
var nameA = a.name.toUpperCase(); // ignore upper and lowercase
var nameB = b.name.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// 이름이 같을 경우
return 0;
});
참고
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort