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

How to return the lowest date value and highest date value from an array in Javascript?

本文关键字:日期 高日期 数组 返回 Javascript      更新时间:2023-09-26

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

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

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"}
]; 

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

我们只需要应用一些Javascript魔术。

var result = Math.max.apply( null, data.map(function( v ) {
    return +new Date( v.date );
}));

在那里,我们将这些对象从ISO日期字符串映射到它们的时间戳表示中。然后,我们简单地将Math.maxMath.min分别应用于生成的Array。我们现在要做的就是将时间戳重新转换为Date对象

new Date( result );

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

var max = data.reduce(function( prev, current ) {
  return prev.date > current.date ? prev : current;
});
// for the min version just ">" to "<"

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

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;

一个简单的字符串比较应该会给出预期的结果。由于日期是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];

如果您对applycall感到满意,那么将这个简单的逻辑转换为函数应该不会有太大困难。

您可以根据这些键进行排序,然后取第一个和最后一个值:

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];

试试这个:

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"}
];
var lowest = data.reduce(function (a, b) {
    var timeA = new Date(a.date).getTime();
    var timeB = new Date(b.date).getTime();
    return timeA < timeB ? a : b;
});
alert("lowest: " + JSON.stringify(lowest, null, 4));
var highest = data.reduce(function (a, b) {
    var timeA = new Date(a.date).getTime();
    var timeB = new Date(b.date).getTime();
    return timeA > timeB ? a : b;
});
alert("highest: " + JSON.stringify(highest, null, 4));

有很多将字符串转换为日期的建议,但使用Date构造函数解析字符串是不可靠的,即使对于ES5中指定的格式,对于使用中的合理数量的浏览器来说,也会失败。

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

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;

正如其他人所说,最后一个日期字符串是无效日期,排序应该如何处理?上面的建议并没有测试日期是否有效,只是看字符。