티스토리 뷰

JavaScript

JS - 배열 함수 sort()

김관장 2022. 4. 7. 23:17

1. sort()

.sort()는 JS의 배열의 기본 함수로 말 그대로 정렬기능을 제공한다. 하지만 우리가 알고있는 정렬과 조금 다르다.

 

나의 경우 알고리즘 문제를 풀다 데이터를 정렬하는 로직에서 이상한 점을 느꼈다.
이와 같이 [123,23,3] 을 정렬하면 [3,23,123]이 나와야하는데,  [123,23,3] 이 나온다.

구글링을 해보니 JS에서 배열의 sort() 함수는 배열 안 데이터들을 모두 문자열이라고 생각하고 정렬을 한다는 사실을 알았다.

 

2. 해결법

출처 : MDN Web Docs

위 MDN 문서를 참고해보면, sort()함수 안의 람다 함수로 올바르게 정렬 할 수 있다.

 

  • 즉 sort() 함수에서 두 값을 비교 시 리턴값에 따라
    return -1 => a를 b보다 낮은 인덱스로 정렬 a, b
    return 0  => a, b를 변경하지 않음
    return 1  => b를 a보다 낮은 인덱스로 정렬 b, a

* 문자열(유니코드)끼리는 >, < 연산은 가능하지만 - 연산은 불가능하기 때문에 제대로 된 비교가 이루어지지 않는다.

 

let sorted = [123, 23, 3] // 숫자형 배열

let s1 = sorted.sort() // = [123, 23, 3]
let s2 = sorted.sort((a,b)=>a-b) // 오름차순 정렬 = [3, 23, 123]
let s3 = sorted.sort((a,b)=>b-a) // 내림차순 정렬 = [123, 23, 3]


let sorted2 = ['a', 'abc', 'd'] // 문자열 배열 혹은 문자열,숫자 조합의 배열
//문자열(유니코드)끼리는 >, < 연산은 가능하지만 - 연산은 불가능하기 때문에 제대로 된 비교가 이루어지지 않기때문에 
//아래와 같이 정렬한다.

let s4 = sorted2.sort((a, b) => {

            if (a < b) return -1;
            
            if (a > b) return 1;
            
            if (a === b) return 0;
            
            else return -1;
        });
        
// return -1 => a를b보다 낮은 인덱스로 정렬 a, b
// return 0  => a, b 변경하지 않음
// return 1  => b를a보다 낮은 인덱스로 정렬 b, a  

// = ['a', 'd', 'abc']

 

'JavaScript' 카테고리의 다른 글

JS - String() 과 toString()  (0) 2022.04.13
JS - Spread 문법  (0) 2022.04.08
JS - JSX?  (0) 2022.03.31
JS - Map() 과 Set()  (0) 2022.03.02
JS - 불변성(ps. Immutable)  (0) 2022.02.24
댓글