코딩테스트 문제를 풀면서 sort()
메서드를 제대로 활용하지 못해서 시간을 많이 잡아 먹은 적이 있다.
이를 계기로 sort() 메서드를 총 정리 해보려고 한다.
arr.sort([compareFunction])
기본적
으로 오름차순 정렬
const strings = ['d', 'c', 'a', 'b'];
strings.sort(); // [ 'a', 'b', 'c', 'd' ]
sort()
한 후 reverse()
해줘야 함const strings = ['d', 'c', 'a', 'b'];
strings.sort().reverse(); // [ 'd', 'c', 'b', 'a' ]
아무런 옵션을 넣지 않으면 각 요소가 문자열로 변환
되기 때문에 아래와 같이 의도하지 않은 결과
가 반환 됨
const nums = [3, 2, 5, 15, 4, 22, 8, 11];
nums.sort(); // [11, 15, 2, 22, 3, 4, 5, 8]
따라서, 숫자의 경우 매개변수에 비교 함수를 넣어 줘야 함
비교 함수의 결괏값에 따라 정렬 방식이 바뀜
결괏값 <= 0
: 각 요소의 앞/뒤가 바뀌지 않음결괏값 > 0
: 각 요소의 앞/뒤가 바뀜1) 숫자 오름차순 정렬
const nums = [3, 2, 5, 15, 4, 22, 8, 11];
nums.sort((a, b) => a - b); // [2, 3, 4, 5, 8, 11, 15, 22]
가장 먼저 a, b에 0번째와 1번째 값이 순서대로 들어갔다고 가정 해 보자. 3 - 2
는 1
로 결괏값이 0보다 크다
. 위 설명에 따르면 이 두 요소의 앞/뒤 순서는 바뀌게 된다. 이러한 과정을 모든 요소에 걸쳐서 수행하면 결국 숫자가 오름차순으로 정렬될 것이다.
2) 숫자 내림차순 정렬
내림 차순으로 정렬하려면 1번의 결괏값에 부호
만 바꿔주면
된다.
const nums = [3, 2, 5, 15, 4, 22, 8, 11];
nums.sort((a, b) => -(a - b)); // [22, 15, 11, 8, 5, 4, 3, 2]
아래 items
배열을 name
속성 기준으로 오름차순
정렬
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 }
];
items.sort((a, b) => {
let str1 = a.name;
let str2 = b.name;
if (str1 > str2) {
return 1;
}
if (str1 < str2) {
return -1
}
});
/** result
[
{ name: 'And', value: 45 },
{ name: 'Edward', value: 21 },
{ name: 'Magnetic', value: 13 },
{ name: 'Sharpe', value: 37 },
{ name: 'The', value: -12 },
{ name: 'Zeros', value: 37 }
]
*/
0번째
index는 오름차순
, 1번째
index는 내림차순
으로 정렬하는 경우
const nums = [[2, 4], [5, 1], [1, 3], [2, 1], [9, 1], [3, 4], [1, 9]];
nums.sort((a, b) => a[0] - b[0]).sort((a, b) => {
if (a[0] === b[0]) {
return b[1] - a[1];
} else {
return 0;
}
})
console.log(nums);
/** result
[
[ 1, 9 ], [ 1, 3 ],[ 2, 4 ], [ 2, 1 ], [ 3, 4 ], [ 5, 1 ], [ 9, 1 ]
]
*/