2013-07-26 14 views
8

私は配列を持っています。配列には、曜日名の1〜7個の一意の文字列を含めることができます。日の名前は、月から日の順になります。 - 例えば:javascriptで日の配列を並べ替え

[「火」、「木」、「日」]

私は順序が今日から始まることになるように、その配列をソートするためにJavaScriptを使用します。

すなわち:今日は金曜日であれば、今日は木曜日その後、ソートされた配列である場合、ソートされた配列は

[「日」、「火」、「木」]

をする必要があります

[ "木"、 "日"、 "火"]

なる必要がありますすることができ誰も助けてくれる?

+9

では、これまでに何を試しましたか?コードとライブデモを投稿してください。 – elclanrs

答えて

8
function sort_days(days) { 

今日の曜日を取得するには、new Date().getDay()を使用してください。これは、Sunday = 0, Monday = 1, ..., Saturday = 6と仮定しています。ソートする最後

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']ある)

、:名前のリストをスライスした後、曜日のリストを生成する

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

使用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あなたもプレイすることができます。一緒にプレイする

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

代わりに、あなただけの組み込みの同様の戦略次Array.sortメソッドを使用することができます。

+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、配列のスプライスフィルタ及び連結機能、ループする必要を使用して簡単な方法である:

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"];