カレンダー レコードが何らかの順序で並べられている限り、二分探索アルゴリズムを適用できます。日付を文字列ではなくタイムスタンプとして保存すると、比較が高速になる可能性があります (ただし、現在の形式では文字列比較も機能します)。
カレンダーを「週」でインデックス化する方がエレガントかもしれません。何かのようなもの
{
"Week 1": ['2011-04-26', '2011-05-02', '2010 - 11'],
"Week 2": ['2011-05-03', '2011-05-09', '2010 - 12'],
...
}
配列からこのルックアップ オブジェクトを作成するのcalendar
は O(n) の複雑さがあるため、1 つのレコードのみを検索する必要がある場合は、元の配列での線形検索でも高速になることに注意してください。
元の配列のサンプル アルゴリズム:
var calendar = [
['2011-04-26', '2011-05-02', 'Week 1', '2010 - 11'],
['2011-05-03', '2011-05-09', 'Week 2', '2010 - 12'],
...
];
function getRecord(date) {
var l = 0,
r = calendar.length-1;
while (l <= r) {
var m = ~~(l + (r-l)/2);
var comp = comparefn(this[m]);
if (calendar[m][1] < date) // last day of week before date
l = m+1;
else if (calendar[m][0] > date) // first day of week after date
r = m-1;
else // week found
return calendar[m];
}
// I'm not quite sure what happens when a date lies between two weeks in the calendar
return null;
}