Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组中日期的最小/最大值?_Javascript_Date_Max_Min - Fatal编程技术网

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非常有效,而且它支持日期类型。如果你否决投票,请发表评论。为什么这是一个坏的选择?我喜欢语法,对于小数组,性能损失可以忽略不计。我被否决了。鲁德雷斯的回答与我上面的答案完全相同。不知道为什么人们不喜欢这样。这是一行代码,而不是很多行代码