私はそれに日を含む配列を持っています。毎日がオブジェクトです。たとえば、次のようになります。
{day_year: "2012", day_month: "08", day_number: "03", day_name: "mon"}
以下を使用して、各日のオブジェクトにタイムスタンプ属性も追加しました。
function convertDays() {
var max_i = days.length;
for(var i = 0; i < max_i; i++) {
var tar_i = days[i];
tar_i.timestamp = new Date(tar_i.day_year, tar_i.day_month, tar_i.day_number);
}
}
配列内の日は任意であるため、実際のロジックはありません。
ここで、特定の日付に最も近い 2 日を見つけたいと考えています。したがって、日の配列に含まれる場合
- 2012 年 8 月 2 日
- 2012 年 8 月 4 日
- 2012 年 8 月 23 日
2012 年 8 月 11 日を検索すると、2012 年 8 月 4 日と 2012 年 8 月 23 日が返されます。
次のような別の質問からの回答を使用してみました。
function findClosest(a, x) {
var lo, hi;
for(var i = a.length; i--;) {
if(a[i] <= x && (lo === undefined || lo < a[i])) lo = a[i];
if(a[i] >= x && (hi === undefined || hi > a[i])) hi = a[i];
}
return [lo, hi];
}
ただし、これは を返しますunidentified
。
これを達成するための最も効率的な方法 (プロセッサ/メモリの負荷が最も少ない方法) は何でしょうか?
編集:「しかし、それらの結果はどのように「奇妙」ですか?コードとデータの例を提供していただけますか?
現在、次を使用して日付の配列を生成しています。
var full_day_array = [];
for(var i = 0; i < 10; i++) {
var d = new Date();
d.setDate(d.getDate() + i);
full_day_array.push({day_year: d.getFullYear().toString(), day_month: (d.getMonth() + 1).toString(), day_number: d.getDate().toString()});
}
奇妙な点は、以下のコードを使用すると、これは 10 個以下の日付の配列に対してのみ機能することです。11 個以上の日付の配列を使用すると、予期しない結果になります。
例: 2012 年 8 月 6 日から 2012 年 8 月 21 日までの 15 の日付の配列を使用しfindClosest(full_day_array, new Date("30/07/2012");
ます{nextIndex: 0, prevIndex: -1}
。ただし、 を返します{nextIndex: 7, prevIndex: -1}
。なんで?
function findClosest(objects, testDate) {
var nextDateIndexesByDiff = [],
prevDateIndexesByDiff = [];
for(var i = 0; i < objects.length; i++) {
var thisDateStr = [objects[i].day_month, objects[i].day_number, objects[i].day_year].join('/'),
thisDate = new Date(thisDateStr),
curDiff = testDate - thisDate;
curDiff < 0
? nextDateIndexesByDiff.push([i, curDiff])
: prevDateIndexesByDiff.push([i, curDiff]);
}
nextDateIndexesByDiff.sort(function(a, b) { return a[1] < b[1]; });
prevDateIndexesByDiff.sort(function(a, b) { return a[1] > b[1]; });
var nextIndex;
var prevIndex;
if(nextDateIndexesByDiff.length < 1) {
nextIndex = -1;
} else {
nextIndex = nextDateIndexesByDiff[0][0];
}
if(prevDateIndexesByDiff.length < 1) {
prevIndex = -1;
} else {
prevIndex = prevDateIndexesByDiff[0][0];
}
return {nextIndex: nextIndex, prevIndex: prevIndex};
}