Array.Prototype.sort(sortFunc)
JavaScript로 코딩테스트 문제를 풀다보면, sort 함수를 사용해서 값들을 정리하는 경우가 많다.
배열의 내장함수인 sort 함수에 대해서 알아보자.
문자열 정렬은 ASCII 문자 순서대로
// 문자열 정렬
const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]
// 숫자 정렬
const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// expected output: Array [1, 100000, 21, 30, 4]
매개변수가 없는 상황에서 sort 함수를 실행하면, 다음과 같은 결과값이 나온다. 문자 정렬은 우리가 기대한 결과지만, 숫자는 그렇지 않다. 왜 그럴까? 그 까닭은 sort 함수의 매개변수를 생략했을 때 오름차순, ASCII 문자 순서로 정렬되는데 100000을 구성하는 1과 0의 ascii code가 나머지 값보다 작기 때문이다. 따라서 숫자를 정렬하기에는 적합하지 않다.
숫자는 어떻게 정렬할 수 있을까?
답은 sort 함수의 콜백함수에 있다. 콜백함수를 지정하면, 세가지 경우 중 하나가 반환되는데
- 첫 번째 인수가 두 번째 인수보다 작을 경우 : - 값
- 두 인수가 같을 경우 : 0
- 첫 번째 인수가 두 번째 인수보다 클 경우 : + 값
const array = [3, 30, 34, 5, 9];
array.sort((a, b) => {
console.log(a - b < 0); // true 반환 (오름차순 정렬), 첫번째 인자가 더 작은 경우
return a - b;
}
);
array.sort((a, b) =>
array.sort((a, b) => {
console.log(b - a > 0); // true 반환 (내림차순 정렬), 두번째 인자가 더 큰 경우
return b - a;
}
);
위와 같이 첫번째 인자가 더 작고 함수의 리턴값이 - 값이면 오름차순으로 정렬되고 두번째 인자가 더 크고 리턴 값으로 +값이 반환되면 내림차순으로 정렬되는 것을 알 수 있다.
객체는 어떻게 정렬할까?
자바스크립트의 객체를 정렬하는 것은 까다로운 일이다. 하지만 배열의 내장함수 sort를 사용하면, 위와 같이 숫자를 배열하듯 손쉽게 정렬할 수 있다. 방법은 다음과 같다. 먼저 정렬하고 싶은 객체들을 하나의 배열 안에 넣어준다. 예를 들어, 아래와 같이 배열 안에 객체(key와 value로 이루어진 값)가 있다고 해보자.
const songs = [];
let obj;
for (let i = 0; i < len; i++) {
obj = {};
obj.index = i;
obj.genre = genres[i];
obj.play = plays[i];
songs.push(obj);
}
console.log(songs);
// [{ index: 0, genre: 'classic', play: 500 },
// { index: 1, genre: 'pop', play: 600 },
// { index: 2, genre: 'classic', play: 150 },
// { index: 3, genre: 'classic', play: 800 },
// { index: 4, genre: 'pop', play: 2500 }]
객체의 key 값인 play를 기준으로 가장 많이 재생된 곡들을 기준으로 배열을 정리하고 싶으면 객체의 필드 값을 참조하여, 해당 필드 값을 내림차순으로 정렬해주면 된다. 그러면 아래와 같이 정렬된 모습을 볼 수 있다.
songs.sort((a, b) => b.play - a.play);
// [{ index: 4, genre: 'pop', play: 2500 },
// { index: 3, genre: 'classic', play: 800 },
// { index: 1, genre: 'pop', play: 600 },
// { index: 0, genre: 'classic', play: 500 },
// { index: 2, genre: 'classic', play: 150 }]
이상으로 자바스크립트에서 자주 쓰이는 sort 함수에 관하여 알아보았다. 다음 시간에는 그 다음으로 자주 쓰이는 filter 함수에 관하여 정리해보겠다.
'Language > JS(Node.js)' 카테고리의 다른 글
프론트엔드 면접 질문 정리 ② JavaScript 질문 (0) | 2021.05.14 |
---|---|
[JavaScript 내장함수 다루기 ②] Array.Prototype.Filter, 조건에 부합하는 값만 반환한다. (0) | 2021.05.12 |
[JavaScript 객체 파헤치기 ①] Object.key(obj), 객체의 필드 값을 배열로 반환해준다 (0) | 2021.05.12 |
[JavaScript] Scroll Event에 자주 쓰이는 변수/메소드 정리 (0) | 2020.11.13 |
[JavaScript] 객체란 무엇인가? (0) | 2020.11.12 |
댓글