如何在Javascript中从数组返回最低日期值和最高日期值?

如何在Javascript中从数组返回最低日期值和最高日期值?,javascript,arrays,date,dictionary,crossfilter,Javascript,Arrays,Date,Dictionary,Crossfilter,如何从数组中返回最低日期值和最高日期值 例如,对于下面的数组,我想创建一个返回最低日期的函数,以及另一个返回最高日期的函数 var data = [ {date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"}, {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"}, {date: "2

如何从数组中返回最低日期值和最高日期值

例如,对于下面的数组,我想创建一个返回最低日期的函数,以及另一个返回最高日期的函数

var data = [
  {date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"},
  {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"},
  {date: "2011-11-14T16:28:54Z", quantity: 1, total: 300, tip: 200, type: "visa"},
  {date: "2011-11-14T16:30:43Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T16:48:46Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T16:53:41Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0, type: "cash"},
  {date: "2011-11-14T16:58:03Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T17:07:21Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T17:22:59Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T17:25:45Z", quantity: 2, total: 200, tip: 0, type: "cash"},
  {date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "visa"}
]; 

我不确定这是否相关,但我将这个数组与crossfilter一起使用,所以我不确定crossfilter是否有任何有用的方法

我们只需要应用一些Javascript

在这里,我们将这些对象映射为ISO日期字符串中的时间戳表示形式。然后,我们只需在结果数组上分别应用一个
Math.max
。我们现在要做的就是将时间戳重新转换为日期对象

new Date( result );

还有一个替代解决方案,使用
Array.prototype.reduce
和纯字符串比较(如果您害怕在解析ISO日期字符串时浏览器不兼容)

var max=data.reduce(函数(上一个,当前){
返回上一个日期>当前日期?上一个:当前;
});

//对于min版本,只需“>”到“”,您可以按这些键进行排序,然后获取第一个和最后一个值:

sortedData = data.sort(function(a, b) {
    return new Date(a.date) > new Date(b.date) ? 1 : -1;
});
var min = sortedData[0],
    max = sortedData[sortedData.length - 1];

您可以使用自定义比较器对阵列进行排序:

data.sort(function(o1,o2){
    return new Date(o1.date).getTime() - new Date(o2.date).getTime();
});
然后通过获取第一个/最后一个项目来获取最大/最小日期:

var smallest = data[0].date;
var largest  = data[data.length - 1].date;
试试这个:

var数据=[
{日期:“2011-11-01T16:17:54Z”,数量:2个,总数:190个,提示:100个,键入:“tab”},
{日期:“2011-11-14T16:20:19Z”,数量:2个,总数:190个,提示:100个,键入:“tab”},
{日期:“2011-11-14T16:28:54Z”,数量:1,总数:300,小费:200,类型:“visa”},
{日期:“2011-11-14T16:30:43Z”,数量:2,总数:90,提示:0,键入:“tab”},
{日期:“2011-11-14T16:48:46Z”,数量:2,总数:90,提示:0,键入:“tab”},
{日期:“2011-11-14T16:53:41Z”,数量:2,总数:90,提示:0,键入:“tab”},
{日期:“2011-11-14T16:54:06Z”,数量:1,总数:100,小费:0,键入:“现金”},
{日期:“2011-11-14T16:58:03Z”,数量:2,总数:90,提示:0,键入:“tab”},
{日期:“2011-11-14T17:07:21Z”,数量:2,总数:90,提示:0,键入:“tab”},
{日期:“2011-11-14T17:22:59Z”,数量:2,总数:90,提示:0,键入:“tab”},
{日期:“2011-11-14T17:25:45Z”,数量:2,总数:200,小费:0,类型:“现金”},
{日期:“2011-11-31T17:29:52Z”,数量:1,总数:200,小费:100,类型:“visa”}
];
var lowest=数据减少(函数(a,b){
var timeA=新日期(a.Date).getTime();
var timeB=新日期(b.Date).getTime();
返回时间atimeB?a:b;
});

警报(“highest:+JSON.stringify(highest,null,4));
一个简单的字符串比较应该会给出预期的结果。因为日期是ISO字符串格式的,所以这应该很容易做到

var lowestIndex = 0;
var lowestDate = data[0].date;
for (var i=0; i<data.length; i++) {
    if (lowestDate > data[i].date) {
        lowestDate = data[i].date;
        lowestIndex = i;
    }
}
return data[lowestIndex];
var lowestinex=0;
var lowestDate=数据[0]。日期;
对于(变量i=0;i数据[i]。日期){
lowestDate=数据[i]。日期;
Lowestinex=i;
}
}
返回数据[Lowestinex];

如果您熟悉
apply
call
,那么将这个简单的逻辑转换为函数应该不会有太多问题。

很多将字符串转换为日期的建议,但是使用日期构造函数解析字符串是不可靠的,即使对于ES5中指定的格式,也会失败,无法获得合理的结果正在使用的浏览器数

由于您使用的是ISO 8601格式的日期字符串,因此可以在不进行转换的情况下对其进行排序(这是使用该格式的好处之一,而且不会产生歧义)。因此,您可以使用以下方法对数组进行排序:

data.sort(function(a, b) {return a.date > b.date? 1 : a.date < b.date? -1 : 0});

正如其他人所说,last date字符串是无效的日期,排序应该如何处理?上面的建议并不测试日期是否有效,它只是查看字符。

数组是否总是这样排序?因为您可以简单地返回第一个或最后一个日期。last date不能转换为日期属性y、 你可以对数组排序,然后得到上下界。看看这个答案:@Andy我现在意识到自己,由于某种原因,最后一个条目似乎有点不对劲。这是个好答案。不过,在循环中进行简单的字符串比较也可以得到OP的预期结果。我也喜欢将日期强制为毫秒的巧妙技巧@安迪,我打赌你也喜欢升级后的魔法!@jAndy,那是什么魔法?好吧,但对所有日期进行排序,只得到最低和最高的日期,并不是最有效的方法。另一种排序数组的方法是:
var lowestIndex = 0;
var lowestDate = data[0].date;
for (var i=0; i<data.length; i++) {
    if (lowestDate > data[i].date) {
        lowestDate = data[i].date;
        lowestIndex = i;
    }
}
return data[lowestIndex];
data.sort(function(a, b) {return a.date > b.date? 1 : a.date < b.date? -1 : 0});
var earliestDate = data[0].date;
var latestDate   = data[data.length - 1].date;