2014-11-14 2 views
10

왜 lodash가 일반 자바 스크립트 sort()과 비교하여 문자열 형식의 날짜 배열을 정렬하지 않는지 알고 싶습니다. 예상되는 동작입니까, 아니면 버그입니까?Lo-Dash sortBy 문자열 형식의 날짜 배열

array = ["2014-11-11", "2014-11-12", null, "2014-11-01", null, null, "2014-11-05"] 

_.sortBy(array); 
// ["2014-11-11", "2014-11-12", null, "2014-11-01", null, null, "2014-11-05"] 

_.sortBy(array, function(value) {return new Date(value);}); 
// [null, null, null, "2014-11-01", "2014-11-05", "2014-11-11", "2014-11-12"] 

array.sort() 
// ["2014-11-01", "2014-11-05", "2014-11-11", "2014-11-12", null, null, null] 

사용 된 버전 : Lo-Dash v2.4.1 - Modern build.

답변

20

lodash 코드를 살펴보면 구현 방법을 알 수 있습니다. 기능 _.sortBy은 기본 Array.prototype.sort을 사용합니다 (source 참조). 그러나 뿌리는 거기 있지 않습니다. 더 흥미로운 것은 함수가 네이티브 sort (source)에 대한 콜백으로 전달 된 것입니다. 몇 마디에 귀하의

_.sortBy(array, function(value) {return new Date(value);});

가 변환됩니다 :

array.sort(function(a, b) { 
    var aa = new Date(a), 
     bb = new Date(b); 

    if (aa !== bb) { 
     if (aa > bb) { return 1; } 
     if (aa < bb) { return -1; } 
    } 
    return aa - bb; 
}) 

그래서 null의 처음에있는 이유는 무엇입니까? new Date(null)은 배열의 다른 날짜보다 작은 Thu Jan 01 1970 01:00:00을 반환하기 때문에

네이티브는 어떨까요? sort? 사양에 따라 (here 참조) 기본 정렬 순서는 문자열 유니 코드 코드 포인트에 따릅니다. 단순히 네이티브 인 경우 sort은 항목을 문자열로 변환하고 문자열을 비교합니다. 그래서 기본 종류가 떨어지게 같다 :

_.sortBy(array, function(value) {return value + ''; }); 

즉시 '널 (null)'문자열은 항상 ('2014년 11월 11일'와 같은) 날짜 문자열보다 "더 큰"있는 그대로 - null의 결과의 꼬리에있을 것입니다 정렬.

+1

'String'을 함수로 사용하고'+ ''와 같이 String에 주어진 값을 강제 변환한다는 사실을 사용하는'_.sortBy (array, String)'도 사용할 수 있습니다. – yerforkferchips