Javascript 从JSON获取下一个最接近的日期
我正在尝试从数组“dates”中获取最接近今天的日期 示例:今天是2011-09-10->JSON文件中下一个最近的日期是“2012-12-20”->$('div').append('date1:'+dates.date1) 示例2:今天是2012-12-21->JSON文件中下一个最近的日期是“2012-12-25”->$('div').append('date2:'+dates.date2) 尝试了一些解决方案,但没有成功。需要帮助!这里是JSON文件Javascript 从JSON获取下一个最接近的日期,javascript,jquery,json,Javascript,Jquery,Json,我正在尝试从数组“dates”中获取最接近今天的日期 示例:今天是2011-09-10->JSON文件中下一个最近的日期是“2012-12-20”->$('div').append('date1:'+dates.date1) 示例2:今天是2012-12-21->JSON文件中下一个最近的日期是“2012-12-25”->$('div').append('date2:'+dates.date2) 尝试了一些解决方案,但没有成功。需要帮助!这里是JSON文件 [ { "fi
[
{
"fields": {
"field1": "Field1",
"field2": "Field2"
},
"dates": {
"date1": "2012-12-20",
"date2": "2012-12-25",
"date3": "2012-12-31"
}
}
]
假设
array
是保存已解析JSON字符串的变量。这是实现目标的一种方式:
var dates = array[0].dates;
var current = (new Date).getTime();
var closest = null;
var closestDateDif = current;
var i, j;
for (i in dates){
j = current - new Date(dates[i]).getTime();
//j is a temporary variable which now holds the difference between the time stamp and now
if(j >= 0 && j < closestDateDif){
closest = i;
closestDateDif = j;
}
}
//dates[closest] holds the closest date.
//You can even calculate the remainder between now and the next time stamp, for example:
var daysLeft = Math.floor(closestDateDif/24e3/3600);
var-dates=array[0]。日期;
var current=(新日期).getTime();
var=null;
var closestDateDif=当前值;
varⅠ,j;
(i)日期{
j=当前-新日期(日期[i]).getTime();
//j是一个临时变量,现在保存时间戳和now之间的差异
如果(j>=0&&j
改进算法
此版本仅使用日期对象一次
var dates = array[0].dates;
var now = new Date();
var UNIQUENAME = "current/randomstringwhich doesn't exist in date";
//this variable is used to determine whether you've reached the current date or not
function pad(x){return x>9?x:"0"+x}
now.getFullYear() + "-" + pad(now.getMonth()+1) + "-" + pad(now.getDate());
var tmp = [[UNIQUENAME, now]];
for(i in dates){
tmp.push([i, dates[i]]);
}
tmp.sort(function(x,y){return x[1].localeCompare(y[1])});
for(var i=0; i<tmp.length; i++){
if(tmp[i][0] == UNIQUENAME){
i++;
break;
}
}
if(tmp[i]) alert("The closest date is at " + tmp[i][1] + ". Description: " + tmp[i][0]);
else alert("All dates are in the past!")
//tmp[i][1] holds the value of the closest next date
//tmp[i][0] holds the value of the descriptor.
var-dates=array[0]。日期;
var now=新日期();
var UNIQUENAME=“当前/randomstringwhich在日期中不存在”;
//此变量用于确定您是否已到达当前日期
功能板(x){返回x>9?x:“0”+x}
now.getFullYear()+“-”+pad(now.getMonth()+1)+“-”+pad(now.getDate());
var tmp=[[UNIQUENAME,now]];
(i)日期{
tmp.push([i,日期[i]]);
}
sort(函数(x,y){return x[1].localeCompare(y[1])});
对于(var i=0;i无论是谁有这样的解决方案……请把它放回去:)
它所需要的只是一个排序算法
编辑
请仔细阅读这个问题。。。您不希望任何日期之前或当前日期被考虑,即使它更接近。。。这也不难做到:
for (var i in jsondates) {
if(new Date(jsondates[i]) >= new Date())
dates.push(new Date(jsondates[i]))
}
dates.sort(function(a,b){
return Math.abs(1 - a / new Date()) - Math.abs(1 - b / new Date())
});
我意识到已经有了一个公认的答案,但有一种更简单的方法可以做到这一点,只要您有ECMA5阵列和对象可用(您可以在较旧的浏览器上填充它们,而且您应该这样做)
首先,从JSON字符串中获取日期:
var dates = [], datesObj = JSON.parse(string)[0].dates;
for(var d in datesObj){ dates.push(d); }
在这里,您可以通过将日期存储为数组来避免一些麻烦,因为您已经扔掉了密钥
一旦将它们作为一个数组,就可以对它们进行排序,而无需使用一行代码来表示以前的日期:(为了可读性,将它们分成多行)
var upcomingDates=dates.map(函数(d){
返回新日期(d.替换(/(\d+)-(\d+)-(\d+)/,“$2/$3/$1”);
}).过滤器(功能(d){
返回d<新日期();
}).排序(功能(a、b){
返回a-b;
});
使用本机数组方法将为您省去很多麻烦。如果需要像以前一样显示它们,可以使用Date.getFullYear
、Date.getDate()
、和Date.getMonth()
对它们进行格式化。这仍然不起作用:日期对象无法识别“2011-12-12”格式。看看,了解原因。另外,定义当前日期,而不是一个循环调用三次new date()
。@Rob W文档还介绍了ECMAScript第一版和js 1.0。ECMA现在是5,js的答案是1.8.5Thx!但错误日志显示:x[1]未定义->tmp.sort(函数(x,y){返回x[1].localeCompare(y[1]);编辑答案。我改变了var tmp=[现在]代码>到预期的var tmp=[[UNIQUENAME,now]]代码>。它现在应该可以按预期工作了!
var dates = [], datesObj = JSON.parse(string)[0].dates;
for(var d in datesObj){ dates.push(d); }
var upcomingDates = dates.map(function(d){
return new Date(d.replace(/(\d+)-(\d+)-(\d+)/,"$2/$3/$1"));
}).filter(function(d){
return d < new Date();
}).sort(function(a,b){
return a - b;
});