웹 개발 메모장

[자바스크립트] 숫자 배열, 문자 배열 정렬하기 sort() 본문

옛날../자바스크립트

[자바스크립트] 숫자 배열, 문자 배열 정렬하기 sort()

도로롱주 2017. 11. 30. 13:47




배열.sort();




sort() 라는 배열을 정렬해주는 배열의 내장함수가 있습니다.



아래와 같은 배열이 있을 때


1
var arr = ['red''blue''green''white''black'];
cs


아래 처럼 sort() 를 호출해주면


1
arr.sort();
cs


배열이  [ 'black', 'blue', 'green', 'red', 'white' ]  이렇게 ABC 순으로 정렬됩니다.




문제는 아래 처럼 숫자를 정렬하는 경우에도 ABC 순으로 정렬이 되기 때문에


1
2
var arr2 = [1,2,3,10,50,70,8,4];
arr2.sort();
cs


배열이  [ 1, 10, 2, 3, 4, 50, 70, 8 ]  이렇게 정렬됩니다.



따라서


1
arr2.sort(function (f, s) { return f-s; });
cs


결과 : [ 1, 2, 3, 4, 8, 10, 50, 70 ]


이렇게 뺄셈 연산 함수를 인자로 넘겨 크기비교를 하여 리턴되는 값의 음수, 양수를 통해 위치를 판단하게 할 수 있습니다.



내림차순 정렬은 반대로 f-s 가 아닌 s-f return 해주면 음수, 양수가 바뀌므로 내림차순 정렬이 됩니다.


여기서 또 문제는 문자열의 내림차순 정렬입니다.


물론


1
arr.sort().reverse();
cs


결과 :  [ 'white', 'red', 'green', 'blue', 'black' ]


이런 방법으로 우선 정렬시키고 배열을 역순으로 바꾸면 내림차순 정렬이 되겠지만 정렬할 때 내림차순으로 정렬하기 위해선 위에서 숫자를 정렬할 때 처럼 sort() 에 인자로 함수를 넣어주어 음수, 양수를 통해 비교하여 정렬시켜야 합니다.


문자열은 비교연산은 가능하고 뻴셈 연산이 되지 않으니


1
2
3
4
5
function compStringReverse(a, b) {
    if (a > b) return -1;
    else if (b > a) return 1;
    else return 0;
}
cs


위 처럼 함수를 정의하고 아래 처럼 함수를 인자로 넘겨주면 됩니다.


1
arr.sort(compStringReverse);
cs


결과 :  [ 'white', 'red', 'green', 'blue', 'black' ]



Comments