如何在Javascript中从数组中返回最低日期值和最高日期值
How to return the lowest date value and highest date value from an array in Javascript?
如何从数组中返回最低日期值和最高日期值?
例如,对于下面的数组,我想创建一个返回最低日期的函数,以及另一个返回最高日期的函数?
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.max
和Math.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];
如果您对apply
和call
感到满意,那么将这个简单的逻辑转换为函数应该不会有太大困难。
您可以根据这些键进行排序,然后取第一个和最后一个值:
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;
正如其他人所说,最后一个日期字符串是无效日期,排序应该如何处理?上面的建议并没有测试日期是否有效,只是看字符。
- 如何从Angularjs中的新日期获取日期格式
- 正在更新起始日期角度日期范围选择器中的日期选择
- 获取本地时间的JS日期,日期对象中没有时区详细信息
- 通过将6个月添加到今天来获得最后一个月的日期's日期
- 从上一个日期创建日期并添加到该日期
- 选择中的日期与日期选择器相同
- 日期 ISO 日期字符串问题
- 使用 javascript 在页面加载时设置默认引导日期和日期时间值
- 如何在JavaScript中返回两个日期(当前日期和输入日期)之间的字符串差异
- angularjs提交表单中的开始日期结束日期验证应被禁用
- 数字、日期和日期的国际化(i18n);货币(JavaScript)
- 从getTime()类型的日期获取日期和时间,以显示mySQL数据库中的日期
- 如何从html文本框中获取选定的日期是日期
- 如何用字符串日期填充日期选择器表单
- 在Javascript中填充日期和日期:输入:月和年
- 传递日期和日期时间之间的Javascript Date()差异
- 通过单击Javascript中的nextdate按钮,可以增加日期、日期、月份和年份
- 如何在当前日期/特定日期中添加min,并在javascript中比较两个日期
- 引导从日期到日期的日期选择器问题
- 如何使高图表标记具有相对日期的日期时间 X 轴