JavaScript를 공부해보자, sort()

무꾸씨·2023년 8월 27일

안녕하세요?
이전 포스팅에 이어, 배열의 sort 메소드에 대해 추가 정보를 작성하고자 합니다

sort()는 배열 요소를 문자열로 치환하여, 알파벳 순으로 정렬한다고 했었습니다.

const testArr = [2, 3, 1, 249, 100];

해당 배열을 sorting하면 어떤 결과값이 나와야할까요?
저희가 기대하는 값은
[1,2,3,100,249] 이지만 결과값은 [1,100,2,249,3]이 나옵니다
왜 그럴까요?
배열 요소를 sorting하기 위해서, 문자열로 치환했고 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따르기 때문입니다

이러한 문제점때문에 sort() 함수는 뒤에 추가적으로 비교 함수를 파라미터로 받습니다.
sort(compareFunction())이 되는 거죠

비교 함수가 작성되면 원소의 정렬 순서 기준은 비교 함수의 리턴 값에 따라갑니다
비교 함수의 파라미터 a, b를 빼서 음수, 양수, 0에 따라 위치를 옮기는데요.
a-b가 음수일 경우, a를 앞으로
a-b가 양수일 경우, b를 앞으로
a-b가 0일 경우, 변동 없이 그대로 유지합니다

function (a,b) {
	return a-b;
}

// a-b < 0 = a를 앞으로 [a, b]
// a-b > 0 = b를 앞으로 [b, a]
// a-b == 0 = 변동 없음

testArr.sort(function(a,b) {
  return a-b;
});

여기서 또 유의해야할 점은,
비교함수의 파라미터 (a, b)는 사실 배열의 순서대로 들어가는 게 아니라 b가 a보다 앞에 있는 요소입니다.
즉 설명을 하자면, function(next, prev)가 되는 거죠.
무슨 말인지 헷갈리신다면 log를 통해 a,b 값을 각각 노출해보시길 바랍니다.

자바스크립트의 정렬 알고리즘은 Tim Sort 알고리즘이라고 하는데요.
이 알고리즘에 관심이 있으시면 해당 알고리즘에 대해 구글링 해보시면 좋을 것 같습니다.



이번 포스팅은 여기까지입니다. 감사합니다.
profile
우동먹으려고 개발하는 김치나베우동 성장기

0개의 댓글