Javascript 从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

我正在尝试从数组“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文件

[
    {
        "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;
  });