2013-07-26 10 views
8

Ho un array. La matrice può contenere da 1 a 7 stringhe univoche di nomi di giorni. I nomi dei giorni saranno in ordine da lunedì a domenica. - ad esempio:Sort serie di giorni in javascript

[ "Mar", "Gio", "Sun"]

voglio usare javascript per ordinare la matrice in modo che l'ordine sarà cominciando con l'oggi.

vale a dire: se oggi è Venerdì, l'array ordinato dovrebbe essere

[ "Sun", "Mar", "Gio"]

se oggi è Giovedi allora l'array ordinato dovrebbe essere

[ "gio", "Sun", "mar"]

Can qualcuno ti aiuta?

+9

Allora, cosa hai provato finora? Per favore pubblica il tuo codice e una demo dal vivo in modo che possiamo aiutarti. – elclanrs

risposta

8
function sort_days(days) { 

Per ottenere giornata di oggi di settimana, utilizzare new Date().getDay(). Ciò presuppone Sunday = 0, Monday = 1, ..., Saturday = 6.

var day_of_week = new Date().getDay(); 

per generare l'elenco dei giorni della settimana, poi tagliare la lista dei nomi:

var list = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]; 
    var sorted_list = list.slice(day_of_week).concat(list.slice(0,day_of_week)); 

(oggi è Venerdì, quindi sorted_list è ['Fri','Sat','Sun','Mon','Tue','Wed','Thu'])

Infine, per ordinare, utilizzare indexOf:

return days.sort(function(a,b) { return sorted_list.indexOf(a) > sorted_list.indexOf(b); }); 
} 

Mettere tutto insieme:

function sort_days(days) { 
    var day_of_week = new Date().getDay(); 
    var list = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]; 
    var sorted_list = list.slice(day_of_week).concat(list.slice(0,day_of_week)); 
    return days.sort(function(a,b) { return sorted_list.indexOf(a) > sorted_list.indexOf(b); }); 
} 
+1

Grazie per questo. Questo sembra il modo più efficiente per farlo. – CMH

4

Ecco una funzione mi si avvicinò con:

function sortDays(days) { 
    var daysOfWeek = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]; 
    var today = new Date().getDay(); 
    for (var i=0;i<today;i++) daysOfWeek.push(daysOfWeek.shift()); 
    return daysOfWeek.filter(function(d) { return days.indexOf(d) >= 0; }); 
} 

L'idea generale è quella di ri-organizzare i giorni della settimana da elementi rotanti dall'inizio alla fine in base al largo che giorno è oggi. Quindi, si usa quell'ordine per riordinare l'array di input in modo che corrisponda. Invece di ordinare effettivamente, ho semplicemente filtrato l'array daysOfWeek in base al contenuto dell'array di input.

Non sono sicuro di come sia supportato lo Array.filter, quindi è possibile cambiarlo in un ciclo for generico in base ai browser che si desidera supportare.

Here's a jsfiddle dove si può giocare con esso anche.

In alternativa, si può semplicemente utilizzare il built-in Array.sort metodo seguendo una strategia simile:

var daysOfWeek = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]; 

{ 
    var today = new Date().getDay(); 
    for (var i=0;i<today;i++) daysOfWeek.push(daysOfWeek.shift()); 
} 

function daysOfWeekSorter(x,y) { 
    return daysOfWeek.indexOf(x)-daysOfWeek.indexOf(y); 
} 

var myDays = ["Tue", "Thu", "Sun"]; 
myDays.sort(daysOfWeekSorter); 

E here's another fiddle con cui giocare.

+0

Grazie per questo! Ho appena usato la risposta senza un loop perché mi sembrava più efficiente. – CMH

1

Solo nel caso che abbiamo mai riescono a guadagnare o perdere un giorno, ho costruito la mia per non richiedere un elenco hardcoded giorno :) si spera un giorno avremo un extra di 24 ore tra Sabato e Domenica!

function anyDayNow(dys) { 
    var ret = [], cur = new Date(), today = cur.getUTCDay(), txt; 
    do { 
    txt = cur.toUTCString().split(',')[0]; 
    dys.indexOf(txt)!=-1 && ret.push(txt); 
    cur.setUTCDate(cur.getUTCDate() + 1); 
    } while (cur.getUTCDay() != today); 
    return ret; 
} 

console.log(anyDayNow(["Tue", "Thu", "Sun"])); 
0
function sortDaysByToday(ds){ 
    var days = {Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6}, 
     today = new Date().getDay() 

    return ds.sort(function(a,b){ 
    return (days[a] < today ? days[a] + 7 : days[a]) 
     - (days[b] < today ? days[b] + 7 : days[b]) 
    }) 
} 
0

Ecco un modo semplice utilizzando solo indexOf, filtra giunzione e concat funzioni di array, nessuna necessità di ciclo:

function sortMyArray(toSort) { 
    var today = new Date().toUTCString().substr(0, 3), //get today as 3 letter string 
     list = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"], // days list 
     before = list.splice(0, list.indexOf(today)); // splice what is before today in the list 

    list = list.concat(before); // concat the list with what was spliced 

    return list.filter(function (item) { return toSort.indexOf(item) !== -1}); // return the sorted list with only the asked days 
} 

Uso

console.log(sortMyArray(["Tue", "Thu", "Sun"])); 
+1

Mi piace come questo non abbia bisogno di loop o di ordinamento, ma in realtà non funziona con l'ordine in cui si troverà la matrice. Nell'esempio sopra, l'ordine di toSort sarà ["Tue", "Thu", "Sun "] iniziare con. – CMH

+0

Oh non ho visto che volevi avere un ordinamento anche se il giorno corrente non era nell'array. – dievardump

+0

Ho aggiornato la mia risposta usando ora un filtro – dievardump

3
const days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; 

const sortDays = function (a, b) { 
    a = days.indexOf(a); 
    b = days.indexOf(b); 
    return a < b ? 0 : 1; 
}; 

const myArrayOfDays = ["Tuesday", "Saturday", "Monday", "Thursday"].sort(sortDays); 
// returns ["Monday", "Tuesday", "Thursday", "Saturday"]; 
Problemi correlati