Мин/Макс. Дат в массиве?
Как узнать минимальную и максимальную дату из массива дат? В настоящее время я создаю такой массив:
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"))
Есть ли встроенная функция для этого или я должен написать свой собственный?
Ответы
Ответ 1
Код протестирован с 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));
Ответ 2
Что-то вроде:
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 dev
Ответ 3
_.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')
])
вернет вторую дату в массиве (потому что она самая ранняя).
Ответ 4
Поскольку даты преобразуются в эпоху UNIX (числа), вы можете использовать Math.max/min, чтобы найти их:
var maxDate = Math.max.apply(null, dates)
// convert back to date object
maxDate = new Date(maxDate)
(протестирован только в хроме, но должен работать в большинстве браузеров)
Ответ 5
function sortDates(a, b)
{
return a.getTime() - b.getTime();
}
var dates = [];
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/28"))
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/27"))
var sorted = dates.sort(sortDates);
var minDate = sorted[0];
var maxDate = sorted[sorted.length-1];
Демо: http://jsfiddle.net/AlienWebguy/CdXTB/
Ответ 6
** Использование операторов спредов | 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);
Ответ 7
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 dates = [];
dates.push(new Date("2011-06-25")); // I change "/" to "-" in "2011/06/25"
dates.push(new Date("2011-06-26")); // because conosle log write dates
dates.push(new Date("2011-06-27")); // using "-".
dates.push(new Date("2011-06-28"));
var min=dates.sort((a,b)=>a-b)[0], max=dates.slice(-1)[0];
console.log({min,max});
Ответ 8
var max_date = dates.sort(function(d1, d2){
return d2-d1;
})[0];
Ответ 9
То же, что и сейчас, с распространением:
const maxDate = new Date(Math.max(...dates));
(может быть комментарий на лучший ответ)
Ответ 10
В приведенных выше ответах не обрабатываются значения пустых / undefined, чтобы исправить это. Я использовал приведенный ниже код и заменил пробелы на 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 демо здесь
и использовал его как фильтр с AngularJS в this codepen
Ответ 11
Это особенно замечательный способ сделать это (вы можете получить максимум массива объектов, используя одно из свойств объекта): Math.max.apply(Math,array.map(function(o){return o.y;}))
Это принятый ответ для этой страницы:
Поиск максимального значения атрибута в массиве объектов
Ответ 12
Использование 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 '';
}
}
Надеюсь, что это поможет.