Daylogs/Javascript

Array.sort() 정렬 기준은 문자열의 유니코드 포인트

ohgyun 2019. 5. 31. 16:52

발생일: 2019.05.31

 

키워드: Array.sort, sort, 정렬

 

문제:

 

아래와 같이 sort() 함수로 정렬했는데,

 

    [1, 5, 10, 20].sort();

 

결과가 아래와 같이 기대했던 것처럼 나오지 않는다.

 

    [1, 10, 20, 5]

 

으잉?

 

 

해결책:

 

나만 몰랐나...

Array.sort() 의 기본 정렬 기준은 문자열의 유니코드 포인트였다.

 

숫자로 정렬하려면 아래와 같이 compareFunction 을 넘겨주면 된다.

 

    [1, 5, 10, 20].sort((a, b) => a - b);    

 

기존에 비슷한 코드도 확인해봐야겠다...

 

 

논의:

 

우린 유틸리티 모듈로 언더스코어(underscore.js)를 쓰고 있는데, 언더스코어의 _.sortBy 는 의도대로 숫자로 정렬된다.

코드를 확인해보니, 기본 compareFunction 에서 각 값을 비교하는 과정에서 암묵적으로 형변환되었기 때문이다.

 

  _.sortBy = function(obj, iteratee, context) {
    var index = 0;
    iteratee = cb(iteratee, context);
    return _.pluck(_.map(obj, function(value, key, list) {
      return {
        value: value,
        index: index++,
        criteria: iteratee(value, key, list)
      };
    }).sort(function(left, right) {
      var a = left.criteria;
      var b = right.criteria;
      if (a !== b) {
        if (a > b || a === void 0) return 1;
        if (a < b || b === void 0) return -1;
      }
      return left.index - right.index;
    }), 'value');
  };

 

우리 코드는 _.sortBy()를 쓰는 것으로 처리했다.

 

 

참고:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

 

반응형