티스토리 뷰
발생일: 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