我有一个包含日期的数组。每个日期都是一个对象,例如:
{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);
}
}
这个数组中的日期是随意的,所以没有真正的逻辑关系。
现在我想找到离任何给定日期最近的两个日期。如果这个日期数组包含以下日期:
- 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];
}
然而,这返回了未标识
。
如何以最高效的方式(最少的处理器/内存开销)实现这一点?
编辑: "然而,那些结果为何"奇怪"? 你能提供你的代码和数据的一个例子吗?"
我现在正在使用以下内容生成日期数组:
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个或更多日期的数组时,结果就会变得出乎意料。
例如:使用一个由15个日期组成的数组,从2012年8月6日到2012年8月21日。如果我调用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};
}
days[i].timestamp = new Date(days[i].day_year, days[i].day_month, days[i].day_number);
这样做有帮助吗? - Reintypeof lo == "undefined"
。 - JamesMM/DD/YYYY
格式的字符串。不幸的是,new Date("30/07/2012");
会被解析为字符串"Invalid Date",而不是抛出异常。 - cantlin