-
Array.prototype.sort() 메서드Studying/JavaScript 2021. 10. 3. 23:39
배열 요소의 순서를 정렬할 때 Array.prototype.sort() 메서드를 다음과 같이 사용할 수 있다.
const array = [4, 2, 6, 3, 5, 8, 9, 10]; const sorted = array.sort(); console.log(sorted); // [10, 2, 3, 4, 5, 6, 8, 9] console.log(array); // [10, 2, 3, 4, 5, 6, 8, 9]
이때 원본 배열 array 자체의 순서가 변경된 것을 알 수 있다. 즉, sort() 메서드는 mutator method이다.
원본 배열의 순서를 변경하지 않기 위해 다음과 같이 메서드를 사용하겠다.
const array = [4, 2, 6, 3, 5, 8, 9, 10]; const sorted = [...array].sort(); console.log(sorted); // [10, 2, 3, 4, 5, 6, 8, 9] console.log(array); // [4, 2, 6, 3, 5, 8, 9, 10]
sort 메서드를 이용한 기본 정렬은 문자열의 유니코드 순서로 정렬이 된다. 즉 다음과 같이 4보다 10이 더 앞선 순서로 정렬된다.
const array = [4, 2, 6, 3, 5, 8, 9, 10]; const sorted = [...array].sort(); console.log(sorted); // [10, 2, 3, 4, 5, 6, 8, 9]
따라서 number 타입의 값을 가지는 배열을 정렬하기 위해 sort 메서드를 사용할 때에는 주의해야 하며, 메서드를 그대로 사용할 수 없으므로 메서드 호출 시 인수로 정렬 순서를 정의하는 함수를 전달해야 한다.
sort 메서드의 구문은 다음과 같다.
arr.sort([compareFunction])
메서드를 호출할 때 compareFunction을 전달하지 않으면 위에서 살펴보았듯 문자열의 유니코드 포인트 순서로 기본 정렬하고, compareFunction이 제공되면 compareFunction의 반환값에 따라 정렬한다.
compareFunction의 형식을 살펴보자.
function compare(a, b) { if (어떤 순서를 기준으로 a가 b보다 작은 경우, 즉 a가 b보다 앞에 와야 하는 경우) { return 음수; } if (어떤 순서를 기준으로 a가 b보다 큰 경우, 즉 a가 b보다 뒤에 와야 하는 경우) { return 양수; } // 위의 두 경우 외의 경우에는 a와 b가 같다. return 0; }
조건문을 해석해 보면 compare 함수가 매개변수로 전달받은 두 인수 a, b에 대해
두 인수의 순서를 유지할 경우에는 음수를, 두 인수의 순서를 바꾸어 줄 경우에는 양수를, 두 인수가 같을 경우에는 0을 반환해 주는 것이다.
위 형식에 맞게 정수 배열을 정렬해 보자.
우리는 오름차순으로 정수를 정렬하려는 것이므로 a가 b보다 작을 때는 두 인수의 순서를 유지하고, a가 b보다 클 때는 두 인수의 순서를 바꾸어 주어야 하므로 다음과 같이 compare 함수를 작성할 수 있다.
const array = [4, 2, 6, 3, 5, 8, 9, 10]; function compare(a, b) { if (a < b) { return -1; } if (a > b) { return 1; } // 위의 두 경우 외의 경우에는 a와 b가 같다. return 0; } const sorted = [...array].sort(compare); console.log(sorted); // [2, 3, 4, 5, 6, 8, 9, 10]
우리가 정렬하려는 배열은 정수 배열이므로 a와 b의 차 연산을 이용하면 compare 함수를 다음과 같이 더 간략하게 작성할 수 있다.
const array = [4, 2, 6, 3, 5, 8, 9, 10]; function compare(a, b) { return a - b; } const sorted = [...array].sort(compare); console.log(sorted); // [2, 3, 4, 5, 6, 8, 9, 10]
a - b의 값은 a < b일 때 음수, a > b일 때 양수, a = b일 때 0이므로 앞서 정의했던 compare 함수와 동일하게 동작한다.
위 코드를 화살표 함수를 이용하여 다시 작성해 보자.
const array = [4, 2, 6, 3, 5, 8, 9, 10]; const compare = (a, b) => a - b; const sorted = [...array].sort(compare); console.log(sorted); // [2, 3, 4, 5, 6, 8, 9, 10]
const array = [4, 2, 6, 3, 5, 8, 9, 10]; const sorted = [...array].sort((a, b) => a - b); console.log(sorted); // [2, 3, 4, 5, 6, 8, 9, 10]
만약 정수를 내림차순으로 정렬하고 싶다면 a가 b보다 작을 때에는 순서를 유지하고 a가 b보다 클 때에는 순서를 바꾸어 주어야 하므로 compare 함수를 다음과 같이 작성하면 된다.
function compare(a, b) { if (a < b) { return 1; } if (a > b) { return -1; } return 0; }
다시 위 함수를 화살표 함수로 나타내어 보면 다음과 같다.
const array = [4, 2, 6, 3, 5, 8, 9, 10]; const compare = (a, b) => b - a; const sortedDescend = [...array].sort(compare); console.log(sortedDescend); // [10, 9, 8, 6, 5, 4, 3, 2]
반응형'Studying > JavaScript' 카테고리의 다른 글
Date 생성자함수, 프로토타입 객체의 프로퍼티 (0) 2021.10.19 표준 빌트인 객체 Date (0) 2021.10.12 .filter().map()과 .reduce() (0) 2021.10.04 함수 호출 방식에 따른 this 바인딩 (0) 2021.09.28 함수 이름과 기명함수, 익명함수 (2) 2021.09.13