Studying/JavaScript

Array.prototype.sort() 메서드

SEOHEY 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]

 

반응형