arr.sort([compareFunction])
compareFunction이란?
정렬 순서를 정의하는 함수로
이 값이 생략되면, 배열의 element들은 문자열로 변환되어, 유니코드 값 순서대로 정렬된다.
이 함수는 배열에 있는 element 두 개를 파라미터로 입력 받아 계산하여
하게된다 따라서 이를 이용해 숫자 배열을 오름차순 내림차순 등으로 정렬할 수 있게 된다.
오름차순
[-3, 2, 0, 1, 3, -2, -1].sort((a, b) => a - b);
// [-3, -2, -1, 0, 1, 2, 3]
내림차순
[-3, 2, 0, 1, 3, -2, -1].sort((a, b) => b - a);
// [3, 2, 1, 0, -1, -2, -3]
복잡한 객체 배열을 정렬할 수도 있다.
countries.sort((a, b) => b.no - a.no);
/**
[
{ no: 5, code: "CN", name: "China" },
{ no: 4, code: "GB", name: "United Kingdom" },
{ no: 3, code: "US", name: "United States" },
{ no: 2, code: "CA", name: "Canada" },
{ no: 1, code: "KR", name: "Korea" },
]
*/
좀 더 큰 데이터 세트를 다룰 때는 하나의 ㅣ준이 아닌 우선 순위에 따라 여러 기준으로 배열을 정렬해야할 때가 있는데 그럴 때 사용하게 된다.
users.sort((a, b) => {
if (a.gender === b.gender) {
return a.age - b.age;
} else {
return b.gender.localeCompare(a.gender);
}
});
/**
[
{
mail: "wwagner33@gmail.com",
name: "Michael Jenkins",
gender: "M",
age: 51,
},
{
mail: "gregorythomas@gmail.com",
name: "Brett Holland",
gender: "M",
age: 73,
},
{
mail: "hintc12@hotmail.com",
name: "Madison Martinez",
gender: "F",
age: 29,
},
{
mail: "daniel7900@gmail.com",
name: "Karen Rodriguez",
gender: "F",
age: 32,
},
{
mail: "ujacksonxejyen@gmail.com",
name: "Amber Rhodes",
gender: "F",
age: 42,
},
]
*/
sort() 함수로 정렬을 할 때 원본 배열을 거드리지 않아야 하는 경우에는 반드시 배열을 먼저 복제한 후에 배열 사본을 상대로 정렬을 해야한다.
const nums = [3, 1, 2];
const sortedNums = [...nums].sort();
console.log({ nums, sortedNums });
원래는 위와같이 배열을 직접 복제한 뒤에 사용해야 했지만 toSorted()함수가 나온 뒤로는 같은 과정을 좀 더 편리하게 거칠수 있게 되었다.
const nums = [3, 1, 2];
const sortedNums = nums.toSorted();
console.log({ nums, sortedNums });