node.js STREAM
레퍼런스 : 김정환 블로그
자바스크립트
레퍼런스 :MDN Array.prototype.sort()
arr.sort([compareFunction])
매개변수 : 정렬 순서를 정의하는 함수. 각 요소의 문자열 변환에 따라 각 문자의 유니 코드 코드 포인트 값에 따라 정렬됩니다.
반환값 : 원 배열이 정렬됩니다! 복사본이 만들어지지않아요.
sort()함수의 디폴트가 오름차순이에요. 실제로 문자열을 정렬할때 잘 됩니다.
자바스크립트를 사용할때는 보통 처리하는 데이터타입이 문자열 string이었어요...
왜이렇게 되는지 추측을하자면, 숫자를 문자열로 정렬을 하면 말이 되죠.
2보다 1이 먼저잖아요.
const arr = [1, 10000,2,3];
arr.sort(); // 디폴트가 오름차순이에요.
arr; //결과를 예측해보세요 1,2,3,10000 될것같아요? 그러면 이거 보셔야되요.
compare함수를 꼭 정의해주셔야되요. 오름차순이더라도요.
오름차순 정렬갑니다.
const arr = [1, 10000,2,3];
arr.sort( function (a,b){
return a - b;
//return a < b ? -1 : a > b ? 1 : 0; 이 식을 줄이면 위와 같습니다.
});
arr;
내림차순 정렬갑니다.
const arr = [1, 10000,2,3];
arr.sort( function (a,b){
return b - a;
// return a < b ? 1 : a > b ? -1 : 0; 이 식을 줄이면 위와 같습니다.
});
arr;
어떨때 1 어떨때 -1, 0 을 넣는지 기준이 뭔가 싶어서 구체적으로 찾아봤어요.
출처 : comparaFunction - MDN
저는 sort를 할거에요.
['문자',숫자] 형태의 배열을 원소로하는 배열을
숫자를 기준으로 내림차순 할 것이고요.
숫자가 같은 경우에는 '문자'를 오름차순 할 겁니다.
const arr = [
['i', 4],
['s', 4],
['p', 2],
['m', 1]
];
arr.sort(function (a,b){
if( a[1] === b[1]){
return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0;
}
return b[1] - a[1];
});
if( a[1] === b[1]){
return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0;
}
간단히하면!
if( a[1] === b[1]){
return b[0] - a[0]; // 내림차순
//return a[0] - b[0]; //오름차순
}
위 부분 설명을 자세히 하자면요
익명함수로 쓰긴했지만
function(a,b){
a,b에는 각각 배열의 원소중 비교할 두 원소가 들어옵니다.
// arr는 ['문자',정수] 형태의 1차원 배열을 원소로 갖는 1차원 배열이에요.
if( a[0] < b[0] ) { // 문자열 비교!
return -1; // 0보다 작은 경우 a를 b보다 낮은 인덱스로 정렬합니다.
// 'i'는 's'보다 앞에 정렬되야겠죠.
// 'i' < 's' 각문자의 유니 코드 코드 포인트 값으로 비교되죠.
// 유니코드에 대해서 자세히 안봤어요. 지금은 아스키코드가 대응해서 생각했습니다.
}else if( a[0] > b[0] ) {
return 1; // 0보다 크면 a를 b보다 더 높은 인덱스로 정렬합니다.
// 's' > 'p' 은 's'가 'p'보다 더 높은 인덱스로 가야겠죠. ( 수평선 기준 오른쪽이 높은인덱스죠)
} else {
return 0; // 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬
// a 와 b를 비교했는데 순서를 바꾼다는 거겠죠.
// 위에 a[0] < b[0] 경우나 a[0] > b[0] 경우에는 두 값의 위치를 swap함수를 통해 바꿔야겠죠.
}
}