Мін / Макс дат у масиві?


106

Як я можу дізнатись мінімум та максимум дати з масиву дат? Наразі я створюю такий масив:

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"))

Чи є вбудована функція для цього чи я повинен написати свою?

Відповіді:


137

Код тестується на 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));

1
Для перетворення чисел застосовано не для рядка "2011/06/25", а для нової дати ("2011/06/25"). Номер (нова дата ('2011/06/25')) === 1308949200000. Код тестується в Chrome, IE, FF
Ендрю Д.

@RobG - Що ви розумієте під "строковими датами"?
Андрій Д.

напр dates.push('2011/06/05'). Використовуючи рядки, масив можна просто відсортувати, а значення першого та останнього члена повернути та перетворити на дати, якщо це необхідно.
RobG

10
@RobG - у запиті вище масиву містяться об'єкти дати, а не "рядки дати" - відповідь також для об'єктів Date. Використання "рядків дати" в деяких випадках дуже погана практика. Порівняйте наступні два рядки дати: "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:00")): результат правда - це правильний результат!
Ендрю Д.

@AndrewD. Якщо dateStrings є послідовним, скажімо, YYYY/MM/DD HH:MM:SSі існує багато рядків, рекомендуєте порівняння рядків чи Number(new Date(dateString))порівняння?
BlackPanther

83

Щось на зразок:

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


Array.reduce()недоступні в IE до IE9. Хоча крута ідея.
jfriend00

1
Array.reduce () можна реалізувати за допомогою функції еквівалентного javascript
Ендрю Д.

Точно читайте про це у Красномовному 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); }, array); return base; }
плавте

1
IE <9 може померти, і дійсно, на даний момент він складає лише 9,3% глобального використання браузера станом на квітень 2013 року.
wprl

3
Рішення скорочення працює для рядків і для об'єктів Dates.
Бенуа

33

_.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')
])

поверне другу дату в масиві (тому що вона є найбільш ранньою).


3
Не відповідає безпосередньо на запитання ОП. ОП запитує, чи є вбудований метод доступний у JavaScript. Отже, хоча _.min & _.max можна використовувати для пошуку мінімальних або максимальних дат, але це не те, що шукає ОП. Також розгляд корисної бібліотеки є суперечливою темою.
detj

13
Я з повагою не погоджуюсь і вважаю, що це корисна відповідь, @detj - питання ОП, оскільки зараз написано, передбачає, що або є вбудована функція, або він повинен написати свою, але це неправда. Мені здається розумним вказати на бібліотеки комунальних послуг як альтернативу будь-якому із запропонованих ОП рішень. Але ваші міркування є захисними, а ваш голос - власним.
Марк Амері

16

Те саме, що застосовується, зараз із спред :

const maxDate = new Date(Math.max(...dates));

(міг би бути коментар до найкращої відповіді)


12

Оскільки дати перетворені в епоху UNIX (числа), ви можете використовувати Math.max / min, щоб знайти такі:

var maxDate = Math.max.apply(null, dates)
// convert back to date object
maxDate = new Date(maxDate)

(тестується лише в хромі, але має працювати в більшості браузерів)


8

** Використовуйте оператори розповсюдження | 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);


1
Якщо ви заявляєте, будь ласка, прокоментуйте. Чому це поганий варіант? Мені подобається синтаксис, і для малих масивів штрафні показники є незначними.
GijsjanB

1
Мене зневажали. Відповідь Рудреша - це мій дублікат вище. Не маю уявлення, чому людям це не подобається. Це один рядок коду проти багатьох рядків.

3
Це повертає число не дату, тому вам доведеться перетворити його назад у дату. Але інакше це досить елегантно.
Томаш Хюбельбауер

6

ОНЛАЙНЕР :

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);.



1

Наведені вище відповіді не обробляють порожні / невизначені значення, щоб виправити це, я використав код нижче та замінив пробіли 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 у цьому кодені



-2

Використання моменту , підкреслення та 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 '';
    }   
}

Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.