【问题标题】:Find missing day from array of dates javascript从日期数组中查找缺少的日期javascript
【发布时间】:2016-11-17 12:16:25
【问题描述】:

我从 API 中获取了一组日期:

0:{date: "2016-11-17T00:00:00",…}
1:{date: "2016-11-18T00:00:00",…}
2:{date: "2016-11-19T00:00:00",…}
3:{date: "2016-11-21T00:00:00",…}
4:{date: "2016-11-22T00:00:00",…}
5:{date: "2016-11-23T00:00:00",…}

在此示例中,数组缺少此日期:

{date: "2016-11-20T00:00:00",…}

从 Javascript 或 Angular 中的日期数组中找出缺失日期的最佳方法是什么?

这样我以后就可以将它作为禁用日传递给日期选择器。

【问题讨论】:

  • 到目前为止你尝试过什么(工作)算法?
  • ... 是什么意思??
  • 我正在考虑:使用两个for循环
  • ... 表示不必要的信息
  • 数据排序了吗?

标签: javascript angularjs arrays


【解决方案1】:

看看这个:

  1. 首先您可以使用Array.prototype.sort对数组进行排序(如果不是这样)

  2. 然后使用Array.prototype.reduce 和hash table 查找缺失的日期

下面的sn-p中给出的演示:

var array=[
  {date:"2016-11-17T00:00:00"},
  {date:"2016-11-19T00:00:00"},
  {date:"2016-11-18T00:00:00"},
  {date:"2016-11-21T00:00:00"},
  {date:"2016-11-22T00:00:00"},
  {date:"2016-11-23T00:00:00"},
  {date:"2016-11-27T00:00:00"}
];

var result = array.sort(function(a,b){
   return Date.parse(a.date) - Date.parse(b.date);
}).reduce(function(hash){
  return function(p,c){
    var missingDaysNo = (Date.parse(c.date) - hash.prev) / (1000 * 3600 * 24);
    if(hash.prev && missingDaysNo > 1) {
      for(var i=1;i<missingDaysNo;i++)
        p.push(new Date(hash.prev+i*(1000 * 3600 * 24)));
    }
    hash.prev = Date.parse(c.date);
    return p;
  };
}(Object.create(null)),[]);

console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}

【讨论】:

  • @alereisan 让我知道您对此的看法...如果日期不按顺序并且如果跳过多个日期,则此方法有效...请注意,如果跳过超过一天接二连三的,也会处理的……
【解决方案2】:

创建一个新数组missingDates[]

使用 for 循环遍历数组(通过您的 API)

for (i = 0; i < array.length; i++){
    var date1 = convert your array item (with index i) to a date
    var date2 = convert your array item (with index i + 1) to a date (keep in mind, index i + 1 cant be > than array.length)

    //calculate diffDays between the 2 dates, if diff is > 1, you have a missing date
    var missingDate = create your missing date (use your date1 variable + 1Day)

    //add misingDate to missingDates[] array
    missingDates.push(missingDate)
}

【讨论】:

    【解决方案3】:

    如果没有丢失日期,您可以使用getMissingDate 方法返回null,如果日期之间的差异大于一天,则返回Date 对象:

    var arr1 = [{date: "2016-11-17T00:00:00"}, {date: "2016-11-18T00:00:00"}, {date: "2016-11-19T00:00:00"}, {date: "2016-11-21T00:00:00"}, {date: "2016-11-22T00:00:00"}, {date: "2016-11-23T00:00:00"}],
        arr2 = [{date: "2016-11-17T00:00:00"}, {date: "2016-11-18T00:00:00"}, {date: "2016-11-19T00:00:00"}, {date: "2016-11-20T00:00:00"}, {date: "2016-11-21T00:00:00"}, {date: "2016-11-22T00:00:00"}, {date: "2016-11-23T00:00:00"}],
        getMissingDate = function(arr) {
          var result = null;
          for (var i = 0, l = arr.length - 1; i < l; i++) {
            var current = new Date(arr[i].date),
                next = new Date(arr[i + 1].date);
    
            if (1 < Math.ceil(Math.abs(next.getTime() - current.getTime()) / (1000 * 3600 * 24))) {
              result = new Date(current.setDate(current.getDate() + 1));
              break;
            } 
          }
    
          return result;
        };
    
    console.log('arr1:', getMissingDate(arr1));
    console.log('arr2:', getMissingDate(arr2));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2022-09-28
      • 1970-01-01
      相关资源
      最近更新 更多