Answers:
代码已通过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));
dates.push('2011/06/05')
。使用字符串可以简单地对数组进行排序,并在需要时返回第一个和最后一个成员值并将其转换为日期。
YYYY/MM/DD HH:MM:SS
涉及很多字符串,您会建议比较字符串还是Number(new Date(dateString))
比较字符串?
就像是:
var min = dates.reduce(function (a, b) { return a < b ? a : b; });
var max = dates.reduce(function (a, b) { return a > b ? a : b; });
在Chrome 15.0.854.0开发人员上测试
Array.reduce()
在IE9之前的IE中不可用。虽然很酷的主意。
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); }, array); return base; }
_.min
并_.max
处理日期数组;如果您正在使用Lodash或Underscore,请使用那些,如果尚未使用,请考虑使用Lodash(提供许多类似的实用程序功能)。
例如,
_.min([
new Date('2015-05-08T00:07:19Z'),
new Date('2015-04-08T00:07:19Z'),
new Date('2015-06-08T00:07:19Z')
])
将返回数组中的第二个日期(因为它是最早的)。
由于日期已转换为UNIX纪元(数字),因此您可以使用Math.max / min查找以下内容:
var maxDate = Math.max.apply(null, dates)
// convert back to date object
maxDate = new Date(maxDate)
(仅在chrome中测试过,但在大多数浏览器中都可以使用)
**使用价差运算符| 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);
这将给出数组中的最小日期。
其简写为Math.min.apply(null,ArrayOfdates);
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);
。
上面的答案不处理空白/未定义的值来解决这个问题,我使用下面的代码并将空白替换为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));
我在这里添加了一个简单的javascript 演示, 并在此Codepen中将其用作AngularJS的过滤器
这是执行此操作的一种特别好方法(您可以使用其中一个对象属性获得最多一个对象数组): Math.max.apply(Math,array.map(function(o){return o.y;}))
这是此页面可接受的答案: 在对象数组中查找属性的最大值
使用Moment,Underscore和jQuery迭代日期数组。
样本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"
}]
Javascript:
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 '';
}
}
希望能帮助到你。