문제를 풀 때 급히 검색해서 사용하고, 해결했지만
그래도 이해하고 넘어가야 할 것 같아서 작성해둔다.
arr.sort()
arr.sort(compareFn(a,b){
return a - b
})
기본적으로 아무 인자도 전달하지 않으면 오름차순으로 정렬하지만,
숫자의 경우에는 좀 특이한 오름차순을 따름.(가장 앞자리 숫자 기준으로 정렬한다)
콜백함수로 compareFn을 받는데, 이 함수로 우리가 진짜 원하는 오름차순과 내림차순 규칙을 구현할 수 있다. ((mdn에 설명을 참고하였음))
이 함수가 리턴하는 값은 양수, 0 , 음수 중 하나여야 한다.
그래서 오름차순, 내림차순 정렬을 구현하고 싶으면 아래 설명을 잘 읽어보아야 한다.
compareFunction(a, b)
이 0보다 작은 경우 a를 b보다 낮은 색인으로 정렬합니다. 즉, a가 먼저옵니다.compareFunction(a, b)
이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다. 참고 : ECMAscript 표준은 이러한 동작을 보장하지 않으므로 모든 브라우저(예 : Mozilla 버전은 적어도 2003 년 이후 버전 임)가 이를 존중하지는 않습니다.compareFunction(a, b)
이 0보다 큰 경우, b를 a보다 낮은 인덱스로 소트합니다.compareFunction(a, b)
은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야합니다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않습니다.
0을 반환하는 경우에는 두 비교 대상의 위치는 그대로 둔다.
객체에 대해서도 마찬가지 방법으로 정렬이 가능하다.
오름차순 정렬*(인자 미전달시 두자리수 이상은 이상하게 정렬됨)
var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
return a - b;
});
console.log(numbers);
// [1, 2, 3, 4, 5]
내림차순 정렬
const numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
return b - a;
});
console.log(numbers);
//[5, 4, 3, 2, 1]
객체의 경우 다음과 같은 식을 쓰기도 한다
let sortedByAge = arrToobj.sort(function (a, b) {
if (a.age > b.age) {
return 1;
}
if (a.age < b.age) {
return -1;
}
return 0;
})
위의 배열에서 쓴 compareFunction이 리턴하는 부분과 동일한 원리다.
첫번째 조건문을 설명하자면 a객체의 age라는 키 값이 b 객체의 것보다 클 경우, 양수를 리턴하라는 뜻인데, 양수를 리턴하게 되면 b객체가 a객체보다 먼저 오도록 정렬이 된다는 뜻이다. 나머지 조건문도 같은 원리로 설명이 가능하며, 결국 이 compareFunction은 객체를 나이에 따라 오름차순 정렬을 한다는 것을 알 수 있다.