브렌쏭의 Veritas_Garage

자바스크립트, Array.prototype.sort() 본문

[Project_하다]/[Project_공부]

자바스크립트, Array.prototype.sort()

브렌쏭 2022. 3. 21. 14:32

자바스크립트에서 어레이 내장 정렬 메소드를 이용해 숫자를 정렬하면 기기묘묘한 일이 생긴다.

[ 1, 2, 5, 7, 10, 20, 80 ] 을 정렬하기 위해 .sort() 를 쓰면 다음과 같이 정렬된다.

[  1,  10,  2,  20,  5,  7,  80 ] 

진짜다

이유는 간단하다. 숫자 데이터 타입으로 들어가 있든, 숫자모양의 문자열로 들어가 있든 일단 자바스크립트의 함수는 모든 데이터타입을 아스키 코드로 바꿔버린 뒤, 그 아스키 코드넘버 순으로 정렬하기 때문이다. 그래서 1 다음에는 10이 오고, 그 뒤에는 100이 온다. 

ASCII....

영화 마션에서 통신을 위해 일일히 주고 받던 것이 아스키 코드이다.

영문 키보드로 입력할 수 있는 모든 기호들이 할당되어 있는 가장 기본적인 부호 체계이다. 한 글자당 7바이트의 내용과 1바이트의 오류검출코드가 들어가 있다. 여러분도 어디 외계행성에 혼자 남겨진 뒤 카메라와 수신호만으로 신호를 주고 받을 경우에 대비해서 가지고 있도록 해라.

아찔하구만

따라서 생각하는 대로 정렬을 하기 위해서는 그냥 sort()를 그대로 사용하지 않고
내부의 콜백함수를 꼭 써야한다.

내부함수의 메커니즘은 "a와 b가 있는데, 뭘 보내줄까?" 의 기준을 정해주는 것이다. sort((a, b) =>{})의 상황이라고 가정한다면,

  • 반환값이 음수: a가 b 보다 작으므로, 앞에 있어야한다.
  • 반환값이 0 : a와 b 는 같은 값이므로 위치를 바꿀 필요가 없다.
  • 반환값이 양수: a가 b보다 크니까, 서로 자리를 바꾼다.
const arr = [1, 2, 3, 20, 40, 100] 일때

평범한 오름차순 상황이라면
arr.sort((a,b) => a - b);

반대로 내림차순 상황이라면
arr.sort((a,b) => b - a );

애로우 펑션을 적극활용해서 쓰면 이정도겠다.

Comments