4주 프로젝트 DAY 15

  • node.js STREAM
  • 자바스크립트 정렬

node.js STREAM

node.js STREAM
레퍼런스 : 김정환 블로그

자바스크립트 정렬

자바스크립트
레퍼런스 :MDN Array.prototype.sort()

arr.sort([compareFunction])

매개변수 : 정렬 순서를 정의하는 함수. 각 요소의 문자열 변환에 따라 각 문자의 유니 코드 코드 포인트 값에 따라 정렬됩니다.
반환값 : 원 배열이 정렬됩니다! 복사본이 만들어지지않아요.

저는 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;
    }

위 부분 설명을 자세히 하자면요

익명함수로 쓰긴했지만 
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함수를 통해 바꿔야겠죠.
    }
}

자바스크립트 정렬 정리

자바스크립트를 제대로 한지 3개월 되었는데요. 와 이걸 이제 알았네요.
오개념이 있었어요.
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 ? -1 : a > b ? 1 : 0;
}); 
arr;

내림차순 정렬갑니다.

const arr = [1, 10000,2,3];
arr.sort( function (a,b){
  return a < b ? 1 : a > b ? -1 : 0;
}); 
arr;

어떨때 1 어떨때 -1, 0 을 넣는지 기준이 뭔가 싶어서 구체적으로 찾아봤어요.
출처 : comparaFunction - MDN


const arr = [
    ['i', 4],
    ['s', 4],
    ['p', 2],
     ['m', 1]
];

arr.sort(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함수를 통해 바꿔야겠죠.
    }
});