2013-07-26 22 views
8

我有一个数组。该数组可以包含1到7个唯一的日期名称字符串。从星期一到星期日,星期几的名字将是顺序的。 - 如:在javascript中排列天数

[“星期二”,“星期四”,“太阳报”]

我想,这样的顺序将与今天开始使用JavaScript来排序该数组。

即:假如今天是星期五,然后排序数组应该是

[“太阳报”,“星期二”,“星期四”]

如果今天是星期四,则排序后的数组应该

[ “星期四”, “太阳报”, “星期二”]

灿有人帮忙吗?

+9

那么到目前为止你尝试过了什么?请发布您的代码和现场演示,以便我们提供帮助。 – elclanrs

回答

8
function sort_days(days) { 

要获得今天的星期几,请使用new Date().getDay()。这假定Sunday = 0, Monday = 1, ..., Saturday = 6

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)); 

(今天是星期五,所以sorted_list['Fri','Sat','Sun','Mon','Tue','Wed','Thu']

最后,排序,使用indexOf

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

全部放在一起:

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

谢谢你。这似乎是最有效的方法。 – CMH

4

这是我想出了一个功能:

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; }); 
} 

的总体思路是:从开始到结束以关闭今天是什么日子转动元件重新安排一周的日子。然后,您使用该顺序重新排列输入数组以匹配。我只是根据输入数组的内容过滤了daysOfWeek数组,而不是实际排序。

我不确定Array.filter支持的程度如何,所以您可能希望将其更改为泛型for循环,取决于您想要支持的浏览器。

Here's a jsfiddle你也可以在那里玩。

或者,你可以使用内置的Array.sort方法如下类似的策略:

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); 

而且here's another fiddle一起玩。

+0

非常感谢!我只是使用没有循环的答案,因为它看起来更有效率。 – CMH

1

以防万一,我们曾经设法获得或失去了一天,我已经建立了矿不需要硬编码的一日清单:)这里的希望有一天,我们得到了周六和周日之间的额外24小时!

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

这里有一个简单的方法只使用的indexOf,数组的拼接滤波器和CONCAT功能,无需循环:

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 
} 

使用

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

我喜欢这种方式不需要循环或排序,但它实际上并不适用于数组的顺序。在上面的示例中,toSort的顺序是[“Tue”,“Thu”,“Sun “]开始。 – CMH

+0

哦,即使当天不在阵列中,我也没有看到你想要排序。 – dievardump

+0

我用现在的一个.filter更新了我的答案 – 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"];