JavaScript Array.sort() - 다양한 예제

Donghwa Kim·2022년 12월 2일
0

JavaScript

목록 보기
2/3

들어가기 전에


코딩테스트 문제를 풀면서 sort() 메서드를 제대로 활용하지 못해서 시간을 많이 잡아 먹은 적이 있다.

이를 계기로 sort() 메서드를 총 정리 해보려고 한다.

Array.sort()


구문

arr.sort([compareFunction])

매개변수

  • compareFunction (Optional)
    • 정렬 순서를 정의하는 함수
    • 생략하면 배열의 각 요소를 문자열로 변환 -> 아스키코드 순으로 정렬

리턴 값

  • 정렬한 배열
  • 원본 배열이 정렬되는 것에 유의
    • 복사본 아님

다양한 예제

문자열 - 오름차순

  • 아무런 옵션을 주지 않으면 기본적으로 오름차순 정렬
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 - 21로 결괏값이 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 }
]
*/

2차원 배열

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 ]
]
*/

References

profile
Slow but steady wins the race🏃‍♂️

0개의 댓글