Trier le tableau par date donne des résultats inattendus
Cela va sembler comme un problème facile, mais j'ai passé mon dimanche à essayer de comprendre quel est le problème avec mon application décrite ci-dessous donc je suis annonce qu'il SORTE comme un dernier recours.
J'ai un javascript de l'application qui reçoit les structures de données à partir d'un serveur. Le serveur envoie les données non triées pour des raisons de performances.
Voici un extrait de la le code javascript de la réception de données:
var seriesRawDataArray = ko.observableArray();
...
analyticscontext.series(seriesRawDataArray).done(function () {
renderSeries();
});
La analyticscontext
module de requêtes de données à l'aide d'ajax:
function series(seriesData) {
return $.ajax({
url: "/api/analytics/series",
type: "GET",
success: function (data) {
return seriesData(data);
}
});
}
La renderSeries
effectue un tri sur les données avant de le rendre:
//Sort the data by date using moment.js
seriesRawDataArray.sort(function (left, right) {
var leftDate = moment.utc(left.timeStamp);
var rightDate = moment.utc(right.timeStamp);
var diff = leftDate.diff(rightDate);
return diff > 0;
});
PROBLÈME
Voici un échantillon de données que je reçois de mon serveur:
Avis les éléments non triés à la fin.
le seriesRawDataArray.sort
semblent avoir aucun effet sur le tableau d'origine qui n'est pas triée peu importe ce que j'changement dans la méthode de tri. La sortie est toujours:
Avis le non triée des éléments ici.
Les bibliothèques que j'utilise et les données n'est certainement pas le problème que ce jsfiddle fonctionne très bien!
Est-il quelque chose de mal avec ce code?
source d'informationauteur GETah
Vous devez vous connecter pour publier un commentaire.
réponse courte
Vous devez retourner la différence entre les deux dates, pas un booléen:
pourquoi
Array.le prototype.trier
s'attend à un négatif, nul ou positif de la valeur à renvoyer. Généralement, vous allez écrire une fonction de tri comme ceci:de La fonction anonyme, passé à trier sert de référence pour le natif de mise en œuvre de la fonction de tri.
Cependant, votre valeur négative n'a pas à être
-1
et votre valeur positive n'a pas à être+1
. Par conséquent, lors du tri des nombres, vous pouvez à la place utiliser le raccourci:En JavaScript, en soustrayant les deux dates retenues d'eux à la fois en chiffres, c'est pourquoi nous pourrions utiliser
return moment.utc(left.timeStamp).diff(moment.utc(right.timeStamp))
(au lieu de direct soustraction
-
cette méthode utilisemoment.le prototype.diff
de lamoment.js
bibliothèque)Cependantdans votre code, vous retourné
diff > 0
qui peut être soittrue
oufalse
. En raison de contrainte de type, JavScript va liretrue
comme1
etfalse
comme0
. Cela signifie que votre fonction de tri ne sera jamais de retour-1
. Par conséquent, les éléments ne seront pas triés correctement.Depuis un moment peut format des dates valides, la meilleure façon est d'utiliser la méthode de tri javascript donc lors du formatage de la date d'horodatage, fondamentalement, vous triez par nombre.
Références: momentjs.com/docs/#/displaying/format , w3schools.com/jsref/jsref_sort.asp