JQuery DataTable Birthday Sort
I’m working on a project that uses DataTables a JQuery plug-in that turns ordinary table into dynamic tables. One of the columns includes a list of birthdays. We didn’t want the standard date sorting. We wanted the birthdays to sort primarily by month. Below you will see the custom sort algorithm I came up with to sort our birthdays.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | function sortdatatable(a,b){ //a is blank return 1 to sort after b if(a == '') return 1; //b is blank return 0 no change if(b == '') return 0; //Split dates on / //format expected is mm/dd/yyyy //array 0 is month //array 1 is day //array 1 is year var x = a.split('/'), y = b.split('/'); //Parse month strings to int for comparison var xInt = parseInt(x[0]), yInt = parseInt(y[0]); //If months are the same check days. if(xInt == yInt){ //Parse day strings to int for comparison var x1Int =parseInt(x[1]), y1Int = parseInt(y[1]); //if days are the same check years if(x1Int == y1Int){ //Parse day strings to int for comparison var x2Int = parseInt(x[2]), y2Int = parseInt(y[2]); //if years are the same return 0. //if xInt is smaller than yInt return 1 to sort after y else return -1 return x2Int == y2Int ? 0 : x2Int < y2Int ? 1 : -1; } else { //if xInt is smaller than yInt return 1 to sort after y else return -1 return x1Int < y1Int ? 1 : -1; } } else { //if xInt is smaller than yInt return 1 to sort after y else return -1 return xInt < yInt ? 1 : -1; } } jQuery.fn.dataTableExt.oSort['birthday-asc'] = function(a, b) { return -(sortdatatable(a,b)); }; jQuery.fn.dataTableExt.oSort['birthday-desc'] = function(a, b) { return sortdatatable(a,b); }; |
The meat of the sorting is the sortdatatable function. The algorithm sorts according to descending order. We compare the months first. If the months are the same we compare days and if the days are the same we compare years. If months, days, and years are all the same we return 0 to leave those two items in the same order.
The ascending and descending algorithms are the inverse of each other. So to save space in the JavaScript file we use the same function and return the -(sortdatatable(a,b)) for the ascending sort.
Leave a Reply