Javascript 数组中日期的最小/最大值?
如何从日期数组中找出最小和最大日期?目前,我正在创建如下数组:Javascript 数组中日期的最小/最大值?,javascript,date,max,min,Javascript,Date,Max,Min,如何从日期数组中找出最小和最大日期?目前,我正在创建如下数组: var dates = []; dates.push(new Date("2011/06/25")) dates.push(new Date("2011/06/26")) dates.push(new Date("2011/06/27")) dates.push(new Date("2011/06/28")) 是否有内置函数来执行此操作,还是我自己编写?类似于: var max_date = dates.sort(function
var dates = [];
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/27"))
dates.push(new Date("2011/06/28"))
是否有内置函数来执行此操作,还是我自己编写?类似于:
var max_date = dates.sort(function(d1, d2){
return d2-d1;
})[0];
var min = dates.reduce(function (a, b) { return a < b ? a : b; });
var max = dates.reduce(function (a, b) { return a > b ? a : b; });
var min=dates.reduce(函数(a,b){返回ab?a:b;});
在Chrome 15.0.854.0 dev上进行测试由于日期转换为UNIX历元(数字),您可以使用Math.max/min来查找:
var maxDate = Math.max.apply(null, dates)
// convert back to date object
maxDate = new Date(maxDate)
(仅在chrome中测试,但应能在大多数浏览器中使用)代码通过IE、FF、chrome测试并正常工作:
var dates=[];
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/27"))
dates.push(new Date("2011/06/28"))
var maxDate=new Date(Math.max.apply(null,dates));
var minDate=new Date(Math.min.apply(null,dates));
和日期数组的工作;如果你使用的是LoASH或下划线,请考虑使用LADASE(它提供了许多类似的实用功能),如果你还没有的话。
比如说,
_.min([
new Date('2015-05-08T00:07:19Z'),
new Date('2015-04-08T00:07:19Z'),
new Date('2015-06-08T00:07:19Z')
])
将返回数组中的第二个日期(因为它是最早的)。这是一种非常好的方法(可以使用对象属性之一获取对象数组的最大值):
Math.max.apply(Math,array.map(函数(o){return o.y;}))
这是本页的公认答案:
使用和来迭代日期数组
示例JSON:
"workerList": [{
"shift_start_dttm": "13/06/2017 20:21",
"shift_end_dttm": "13/06/2017 23:59"
}, {
"shift_start_dttm": "03/04/2018 00:00",
"shift_end_dttm": "03/05/2018 00:00"
}]
function getMinStartDttm(workerList) {
if(!_.isEmpty(workerList)) {
var startDtArr = [];
$.each(d.workerList, function(index,value) {
startDtArr.push(moment(value.shift_start_dttm.trim(), 'DD/MM/YYYY HH:mm'));
});
var startDt = _.min(startDtArr);
return start.format('DD/MM/YYYY HH:mm');
} else {
return '';
}
}
Javascript:
"workerList": [{
"shift_start_dttm": "13/06/2017 20:21",
"shift_end_dttm": "13/06/2017 23:59"
}, {
"shift_start_dttm": "03/04/2018 00:00",
"shift_end_dttm": "03/05/2018 00:00"
}]
function getMinStartDttm(workerList) {
if(!_.isEmpty(workerList)) {
var startDtArr = [];
$.each(d.workerList, function(index,value) {
startDtArr.push(moment(value.shift_start_dttm.trim(), 'DD/MM/YYYY HH:mm'));
});
var startDt = _.min(startDtArr);
return start.format('DD/MM/YYYY HH:mm');
} else {
return '';
}
}
希望能有所帮助。**使用扩展运算符| ES6**
let datesVar = [ 2017-10-26T03:37:10.876Z,
2017-10-27T03:37:10.876Z,
2017-10-23T03:37:10.876Z,
2015-10-23T03:37:10.876Z ]
Math.min(...datesVar);
这将给出数组中的最小日期
它的速记数学.min.apply(null,ArrayOfdates)
以上答案不处理空白/未定义的值。为了解决此问题,我使用了以下代码并将空白替换为NA:
function getMax(dateArray, filler) {
filler= filler?filler:"";
if (!dateArray.length) {
return filler;
}
var max = "";
dateArray.forEach(function(date) {
if (date) {
var d = new Date(date);
if (max && d.valueOf()>max.valueOf()) {
max = d;
} else if (!max) {
max = d;
}
}
});
return max;
};
console.log(getMax([],"NA"));
console.log(getMax(datesArray,"NA"));
console.log(getMax(datesArray));
function getMin(dateArray, filler) {
filler = filler ? filler : "";
if (!dateArray.length) {
return filler;
}
var min = "";
dateArray.forEach(function(date) {
if (date) {
var d = new Date(date);
if (min && d.valueOf() < min.valueOf()) {
min = d;
} else if (!min) {
min = d;
}
}
});
return min;
}
console.log(getMin([], "NA"));
console.log(getMin(datesArray, "NA"));
console.log(getMin(datesArray));
函数getMax(日期数组,填充符){
填充物=填充物?填充物:“”;
如果(!dateArray.length){
回流填料;
}
var max=“”;
dateArray.forEach(函数(日期){
若有(日期){
var d=新日期(日期);
如果(最大值(&&d.valueOf()>最大值(){
max=d;
}否则如果(!max){
max=d;
}
}
});
返回最大值;
};
log(getMax([],“NA”);
日志(getMax(datesArray,NA));
console.log(getMax(datesArray));
函数getMin(日期数组,填充符){
填充物=填充物?填充物:“”;
如果(!dateArray.length){
回流填料;
}
var min=“”;
dateArray.forEach(函数(日期){
若有(日期){
var d=新日期(日期);
如果(最小值和d.valueOf()<最小值of()){
min=d;
}否则,如果(!min){
min=d;
}
}
});
返回最小值;
}
log(getMin([],“NA”);
日志(getMin(datesArray,NA));
console.log(getMin(datesArray));
我添加了一个简单的javascript
并将其用作AngularJS在ONELINER中的过滤器:
var min= dates.sort((a,b)=>a-b)[0], max= dates.slice(-1)[0];
生成变量min
和max
,复杂性O(nlogn),可编辑示例。如果数组没有日期值(如null
),请首先通过dates=dates.filter(d=>d instanceof date)将其清除代码>
var日期=[];
日期。推送(新日期(“2011-06-25”);//我将“2011/06/25”中的“/”改为“-”
日期。推送(新日期(“2011-06-26”);//因为conosle日志写入日期
日期。推送(新日期(“2011-06-27”);//使用“-”。
推送日期(新日期(“2011-06-28”);
var min=dates.sort((a,b)=>a-b)[0],max=dates.slice(-1)[0];
log({min,max})代码>与应用相同,现在具有:
(可能是对最佳答案的评论)Array.reduce()
在IE9之前的IE中不可用。虽然这个想法很酷,但是.Array.reduce()可以用javascript等价的函数来实现,请阅读:function foreach(func,Array){for(var i=0;i!=Array.length;++i){func(Array[i]);}}}function reduce(combine,base,Array){foreach(function(element){base=combine(base,element);},数组);返回基;}
即reduce解决方案适用于字符串和日期对象。对数字的转换不适用于字符串“2011/06/25”,而是适用于新日期(“2011/06/25”)。编号(新日期('2011/06/25'))==1308949200000。代码在Chrome中进行测试,FF@RobG“字符串日期”是什么意思?例如,dates.push('2011/06/05')
。使用字符串可以简单地对数组进行排序,并在必要时返回第一个和最后一个成员值并将其转换为日期。@RobG-在上述问题中,数组包含日期对象,而不是“日期字符串”-对日期对象也有响应。在某些情况下,使用“日期字符串”是一种非常糟糕的做法。比较下两个日期字符串:“2011/06/05”和“2011/06/05 00:00:00”。1) 作为字符串:(“2011/06/05”==“2011/06/05 00:00:00”):结果为假;2) 作为日期对象(转换为数字):数字(新日期(“2011/06/05”)==数字(新日期(“2011/06/05 00:00”):结果为真-是正确的结果@安德烈。如果日期字符串是一致的,比如说YYYY/MM/DD HH:MM:SS
,并且涉及很多字符串,您会推荐字符串比较还是Number(新日期(日期字符串))
比较?这并不能直接回答OP的问题。OP询问JavaScript中是否有内置方法可用。因此,尽管可以使用u.min&uu.max来查找最小或最大日期,但这不是OP所要查找的。此外,考虑实用程序库也是一个固执己见的话题。我尊重地不同意,并认为这是一个有用的答案,@detj-OP的问题目前的措辞假定要么有内置函数,要么他必须编写自己的函数,但这不是真的。在我看来,指出实用程序库作为OP提出的解决方案的替代方案是合理的。但你的理由是站得住脚的,你的投票是你自己的。简短、简洁,对TypeScript非常有效,而且它支持日期类型。如果你否决投票,请发表评论。为什么这是一个坏的选择?我喜欢语法,对于小数组,性能损失可以忽略不计。我被否决了。鲁德雷斯的回答与我上面的答案完全相同。不知道为什么人们不喜欢这样。这是一行代码,而不是很多行代码