2010-08-23 5 views
1

J'essaie de trier un tableau de dates du plus récent au plus ancien, et malheureusement, list.sort (par défaut) trie seulement le premier nombre. Mon tableau ressemble à ceci:Tri jour/mois tableau en Javascript

var MyArray = ["13 Jun", "09 Jun", "25 Aug", "30 Jun", "13 Aug"]; 

J'ai essayé de faire une fonction pour le .Sort de référence, mais le processus est un peu confus pour moi. Quelqu'un pourrait m'aider?

Répondre

5

Vous devrez analyser les chaînes en Date() objets, ce qui serait assez simple s'il n'y avait pas une mauvaise mise en œuvre de l'analyse syntaxique de chaîne de date de IE. Heureusement, vous pouvez utiliser setDate() et setMonth() avec la cohérence entre les différents navigateurs, à la fois accepter les numéros - 1-31 pour setDate(), 0-11 pour setMonth(). La configuration d'un mappage d'objet pour les noms de mois aidera.

Cela fonctionne pour moi:

(function() { 
    // Set up our variables, 2 date objects and a map of month names/numbers 
    var ad = new Date(), 
     bd = new Date(), 
     months = { 
      Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, 
      Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov:10, Dec:12 
     }; 

    MyArray.sort(function (a,b) { 
     // Split the text into [ date, month ] 
     var as = a.split(' '), 
      bs = b.split(' '); 

     // Set the Date() objects to the dates of the items 
     ad.setDate(as[0]); 
     ad.setMonth(months[as[1]]); 
     bd.setDate(bs[0]); 
     bd.setMonth(months[bs[1]]); 

     /* A math operation converts a Date object to a number, so 
      it's enough to just return date1 - date2 */ 
     return ad - bd; 
    }); 
})(); 
//-> ["09 Jun", "13 Jun", "30 Jun", "13 Aug", "25 Aug"] 

J'ai mis en place un exemple pour vous - http://jsfiddle.net/Tw6xt/

+1

Cela fonctionne à merveille! Je vous remercie –

0

Vous pouvez passer une fonction de tri pour faire le tri personnalisé:

function sortDate (a,b) { 
    var aa = a.split(' '); 
    var bb = b.split(' '); 
    var months = { 
     Jan : 1, 
     Feb : 2, 
     Mar : 3 /* you do the rest ... */ 
    } 

    if (months[a[1]] > months[b[1]]) return 1; 
    if (months[a[1]] < months[b[1]]) return -1; 

    return parseInt(a[0],10) - parseInt(b[0],10); 
} 

MyArray.sort(sortDate); 
0

vous devez passer une fonction de tri à la méthode de tri et définir une fonction d'analyse syntaxique de date qui crée une représentation ordonnée de la date comme si:

var MyArray = ["13 Jun", "09 Jun", "25 Aug", "30 Jun", "13 Aug"]; 
MyArray.sort(function (a, b) { 
    a = parseDate(a); 
    b = parseDate(b); 
    if (a < b) { 
      return 1; 
    } else if (a > b) { 
      return -1; 
    } else { 
      return 0; 
    } 
}); 
-1

Voici une solution qui ne répond pas à toutes les constantes.

var MyArray = ["13 Jun", "09 Jun", "25 Aug", "30 Jun", "13 Aug"]; 
var DateArray = []; 
var SortedArray = []; 
var dateBits; 
for (var index = 0; index < MyArray.length; index++) { 
DateArray.push(new Date(MyArray[index] + " 2000")); 
} 
SortedArray = DateArray.sort(); 
MyArray = []; 
for (var index = 0; index < SortedArray.length; index++) { 
    dateBits = SortedArray[0].toDateString().substr(4, 6).split(" "); 
    MyArray[index] = dateBits[1] + " " + dateBits[0]; 
}