Usando jQuery tablesorter para ordenar las fechas mm / aa
-
19-08-2019 - |
Pregunta
Estoy usando el complemento jquery tablesorter para ordenar una tabla. Una de mis columnas en mi tabla muestra la fecha en formato mm / aa.
<tr>
<td class="col-name">...</td>
...
<td rel="2000" class="col-dob">10/00</td>
...
</tr>
<tr>
<td class="col-name">...</td>
...
<td rel="1986" class="col-dob">11/86</td>
...
</tr>
Nota:
- Cada celda tiene una clase única
- La fecha se muestra en formato mm / aa
- La celda con fecha también recibe el año
Mi código jQuery es el siguiente:
// add parser through the tablesorter addParser method
$.tablesorter.addParser({
// set a unique id
id: 'user-birthdate',
is: function(s) {
// return false so this parser is not auto detected
return false;
},
format: function(s) {
// format your data for normalization
var dateSplit = s.split('/');
if(2 !== dateSplit.length)
return 0;
return new Date(dateSplit[1], dateSplit[0], 1);
},
// set type, either numeric or text
type: 'numeric'
});
myClass.init = function() {
$('.module .user table').tablesorter({
sortList: [[0,0]],
widgets: ['zebra'],
headers: {
5: {
sorter:'user-birthdate'
}
}
});
}
myClass.init();
Mi problema es que tableSorter interpreta 00 como año 1900 en lugar de 2000 y, por lo tanto, los datos ordenados no son correctos.
Alguna pista, ¿cómo puedo resolver esto? Estoy usando jQuery 1.2.6 y la última versión de tablesorter.
Solución
La documentación del clasificador de tablas es a menudo bastante inútil, he encontrado. parece como dice mucho, pero le faltan detalles.
En este caso, no le indica la firma de la función para un analizador sintáctico. Afortunadamente, puede leer el código nominificado para encontrarlo.
Allí encontramos que el analizador metadata
hace esto:
format: function(s,table,cell) {
Esto significa que puede ajustar su método de formato a:
format: function(s, table, cell) {
// format your data for normalization
var dateSplit = s.split('/');
var year = $(cell).attr('rel');
if(2 !== dateSplit.length)
return 0;
return new Date(year, dateSplit[0], 1);
},
O al menos similar a eso. En realidad no he probado esto. Pero debería estar al menos muy cerca.
Otros consejos
Creo que encontrará que su problema es el constructor de fecha y la cadena de año de 2 dígitos que está pasando sin desambiguación: new Date(dateSplit[1], dateSplit[0], 1);
No creo que pueda (fácilmente) obtener acceso a rel basado en s en el analizador. ¿Contiene s todo el contenido de la celda? ¿Puede hacer algo en los datos de la celda como: <span style="display : none">CC</span>MM/YY
, eliminar las etiquetas y luego combinar CC con YY en su análisis?