관리 메뉴

흰둥씨의 개발장

[javascript] sort 본문

[오늘의 공부]/Javascript

[javascript] sort

돈워리비해삐 2023. 6. 30. 03:49

javascript의 sort는 자바스크립트의 sort가 아닌 "브라우저엔진의 sort"임 
=> ECMAscript에서 정렬 알고리즘을 규제하고 있지 않고, 브라우저 벤더사에 정렬 알고리즘을 맡겨서,
실행브라우저마다 결과 다를수 있음
ㄴChrome70(2018.10배포버전)은 Timsort (그전에는 삽입정렬(10개이하)과 퀵정렬(10개초과)을 동시 사용했음)
ㄴMozilla는 병합정렬
ㄴsafari는 선택정렬 

 

아래의 예시는 브라우저사마다 발생할수있는 에러 없이 사용할수 있는 정렬방뻐 

단순 숫자열 정렬시

data.sort(); // [1, 10, 11, 2, 20, 22, 30, 40] 
//자바스크립트의 정렬은 앞자리부터 비교하기 때문에 위와 같은 결과 나옴 

data.sort((a,b)=> a - b); //[1, 2, 10, 11, 20, 22, 30, 40] 오름차순 정렬

data.sort((a,b)=> b - a); //[40, 30, 22, 20, 11, 10, 2, 1] 내림차순 정렬


문자열 정렬시 (문자열을 숫자열과 같은 연산자로 정렬하면 NaN나오기 때문에 아래와 같은 방법 사용)

//jsonData는 임의의 배열 
//오름차순 
jsonData.sort((a, b) => (a[key] < b[key] ? -1 : (a[key] > b[key] ? 1 : 0)))

//내림차순
jsonData.sort((a, b) => (a[key] > b[key] ? -1 : (a[key] < b[key] ? 1 : 0)))

 

활용 예시

let data = [
    [6, 'a', 'hello'],
    [3, 'f', 'hello world'],
    [7, 'b', 'hello a'],
    [8, 'g', 'hello world hello'],
    [4, 'e', 'hello world hello world'],
    [2, 'c', 'hello ab'],
    [1, 'd', 'hello abc'],
 ]


data.sort((a, b) => a[2].length - b[2].length); //세번째 긴 문자열이 있는 값의 길이 기준 오름차순 정렬하기
/* [
	[6, 'a', 'hello']
	[7, 'b', 'hello a']
	[2, 'c', 'hello ab']
	[1, 'd', 'hello abc']
	[3, 'f', 'hello world']
	[8, 'g', 'hello world hello']
	[4, 'e', 'hello world hello world']
] */


data.sort((a, b) => a[0] - b[0]); //맨 앞자리 숫자 값 기준으로 오름차순정렬
/* [
[1, 'd', 'hello abc']
[2, 'c', 'hello ab']
[3, 'f', 'hello world']
[4, 'e', 'hello world hello world']
[6, 'a', 'hello']
[7, 'b', 'hello a']
[8, 'g', 'hello world hello']
] */

//두번째 문자 기준 오름차순정렬하기
data.sort((a, b) =>  { //문자열에 연산하면 NaN나오기 때문에 조건식 작성
                if (a[1] > b[1]) return 1;  //조건 만족시 a가 뒤로 가게 
                if (a[1] < b[1]) return -1; //조건 만족시 a가 앞으로 가게 
                if (a[1] === b[1]) return 0;
           }); 
           
/* [
[6, 'a', 'hello']
[7, 'b', 'hello a']
[2, 'c', 'hello ab']
[1, 'd', 'hello abc']
[4, 'e', 'hello world hello world']
[3, 'f', 'hello world']
[8, 'g', 'hello world hello']
] */