2012-02-15 6 views
4

Je suis en train de trier un tableau qui ressemble à ceci:Tri des tableaux imbriqués d'objets par date

var dateGroups = [ 
    [ 
    {age:20, date: Fri Feb 03 2012 14:30:00 GMT+1100 (EST)}, 
    {age:12, date: Fri Feb 03 2012 18:20:00 GMT+1100 (EST)}, 
    {age:18, date: Fri Feb 03 2012 21:43:00 GMT+1100 (EST)} 
    ], 
    [ 
    {age:32, date: Fri Feb 01 2012 10:54:00 GMT+1100 (EST)}, 
    {age:44, date: Fri Feb 01 2012 11:45:00 GMT+1100 (EST)}, 
    ], 
    [ 
    {age:22, date: Fri Feb 05 2012 10:54:00 GMT+1100 (EST)}, 
    {age:22, date: Fri Feb 05 2012 18:22:00 GMT+1100 (EST)}, 
    ] 
] 

Les objets à l'intérieur des tableaux imbriqués de dateGroups sont déjà classés dans l'ordre croissant, mais je veux aussi trier les tableaux eux-mêmes basés sur les dates groupées.

Dans ce cas, le tableau doit alors ressembler à ceci:

var dateGroups = [ 
    [ 
    {age:32, date: Fri Feb 01 2012 10:54:00 GMT+1100 (EST)}, 
    {age:44, date: Fri Feb 01 2012 11:45:00 GMT+1100 (EST)}, 
    ], 
    [ 
    {age:20, date: Fri Feb 03 2012 14:30:00 GMT+1100 (EST)}, 
    {age:12, date: Fri Feb 03 2012 18:20:00 GMT+1100 (EST)}, 
    {age:18, date: Fri Feb 03 2012 21:43:00 GMT+1100 (EST)} 
    ], 
    [ 
    {age:22, date: Fri Feb 05 2012 10:54:00 GMT+1100 (EST)}, 
    {age:22, date: Fri Feb 05 2012 18:22:00 GMT+1100 (EST)}, 
    ] 
] 

La fonction utilisée pour trier devrait également renvoyer la nouvelle version triée de dateGroups.

J'ai essayé d'utiliser la fonction sortBy() de Underscore.js mais je n'arrive pas à comprendre comment trier les tableaux en fonction de la valeur d'une propriété dans l'un des objets. Existe-t-il un moyen spécifique de trier les objets Date? Ou sont-ils triés de la même manière que les chiffres ou les lettres?

+0

Vous pouvez trouver des réponses utiles à ce sujet ici: ** Trier [ Javascript Object Array By Date] (http://stackoverflow.com/a/26759127/2247494) ** – jherax

Répondre

9

Selon la documentation Underscore.js, vous devez simplement écrire votre propre itérateur pour cette cause. Quelque chose comme ceci:

_.sortBy(dateGroups, function(arrayElement) { 
    //element will be each array, so we just return a date from first element in it 
    return arrayElement[0].date.getTime(); 
}); 
4

Vous pouvez les trier en transmettant une fonction de tri personnalisée à Array.sort.

dateGroups.sort(function(a, b) { 
    return b[0].date.getTime() - a[0].date.getTime(); 
}); 

La fonction personnalisée doit retourner un nombre inférieur à zéro (a précède b), supérieure à zéro (a fait suite à b) ou nul (a et b sont égaux).

1

Pour autant que je comprends votre question, vous voulez trier les groupes intérieurs afin que les premières dates seront affichées en premier et ensuite trier les groupes par leurs premières dates. Cela pourrait se faire comme ceci:

var sortedDateGroups = dateGroups.map(function(dateGroup) { 
    // sort the inner groups 
    dateGroup.sort(function(a,b) { 
    return a.date.getTime() - b.date.getTime(); 
    }); 
    return dateGroup; 
}).sort(function(a,b) { 
    // sort the outer groups 
    return a[0].date.getTime() - b[0].date.getTime(); 
}); 

Bien sûr, cela pourrait se faire avec js underscore de façon similaire:

var sortedDateGroups = _.chain(dateGroups).map(function(dateGroup) { 
    return _.sortBy(dateGroup, function(inner) { 
    return inner.date.getTime(); 
    }); 
}).sortBy(function(outer) { 
    return outer[0].date.getTime(); 
}).value()