Safari ne sortinge pas les objects comme les autres navigateurs

var myArray = [{date:"2013.03.01"},{date:"2013.03.08"},{date:"2013.03.19"}]; 

J’ai essayé:

 function(a,b){ return b.date > a.date; } 

et

 function(a,b){ return b.date - a.date; } 

Le fichier console.log dans Chrome et Firefox me donne la sortie souhaitée:

 "2013.03.19", "2013.03.08", "2013.03.01" 

mais Safari donne le sorting initial:

 "2013.03.01", "2013.03.08", "2013.03.19" 

Pourquoi?

Une fonction de sorting en JavaScript est supposée renvoyer un nombre réel – ni vrai ni faux, ni une chaîne ni une date. Que ce nombre soit positif, négatif ou nul affecte le résultat du sorting.

Essayez cette fonction de sorting (qui permet également de sortinger correctement les chaînes dans l’ordre alphabétique inverse):

 myArray.sort(function(a,b){ return (b.date > a.date) ? 1 : (b.date < a.date) ? -1 : 0; }); 

"2013.03.01" n’est pas une date. C’est une ficelle.

Pour pouvoir sortinger correctement les dates, vous devez les convertir en dates (horodatages).

 var myArray = [{date:"2013.03.01"},{date:"2013.03.08"},{date:"2013.03.19"}]; myArray.sort(function(a,b){ return Date.parse(b.date) - Date.parse(a.date); }); 

Vous pourrez également les sortinger à l’aide de comparaisons directes de chaînes:

 myArray.sort(function(a,b){ return b.date.localeCompare(a.date); });