【发布时间】:2012-08-01 11:24:24
【问题描述】:
我有一个包含天数的数组。每一天都是一个对象,例如:
{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];
}
但是,这会返回 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 个或更多日期的数组时,结果都会出乎意料。
例如:使用包含 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);这有帮助吗? -
如果你想谈论效率,那么你应该定义你想如何使用它。例如,您是否需要在一组日期中找到一个最接近的日期,或者您将拥有相同的一组日期并且您将对其进行多次搜索,这一点很重要。
-
我最多有五组天,每组包含大约 200 天。然后我有多达 100 个日期,我必须找到最近的两天。
-
应该是
typeof lo == "undefined"
标签: javascript arrays search