【问题标题】:Jquery Filter array by date rangeJquery按日期范围过滤数组
【发布时间】:2019-10-23 15:33:51
【问题描述】:

我有一个包含日期对象的数组。

但数据太大,无法解析所有内容。我想按日期范围过滤结果(例如:10 天前到 10 天之间)。到目前为止,我只能过滤一个日期。

这是我的代码。我只是不知道如何实现这一目标。

var today = new Date();
var d = today.getDay();
var dd = String(today.getDate()).padStart(2, '0');
var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
var yyyy = today.getFullYear();
today = yyyy + '-' + mm + '-' + dd;

var eventParsed = JSON.parse(eventsObjects).filter(({
    date
}) => date === today);

console.log(eventParsed);

【问题讨论】:

    标签: jquery arrays


    【解决方案1】:

    我认为您可以一起避免字符串操作,只需像这样进行一些日期比较:

    var today = new Date();
    var tenDaysAgo = new Date();
    var tenDaysFromNow = new Date();
    tenDaysAgo.setDate(today.getDate() - 10);
    tenDaysFromNow.setDate(today.getDate() + 10);
    
    var eventParsed = JSON.parse(eventsObjects).filter(({
        date
    }) => date >= tenDaysAgo && date <= tenDaysFromNow);
    
    console.log(eventParsed);
    

    【讨论】:

      【解决方案2】:

      您可以获取绑定日期,例如今天减去 10 天和今天加上 10 天,然后在过滤器中使用它们:

      function formatDate(date)
      {
          var d = date.getDay();
          var dd = String(date.getDate()).padStart(2, '0');
          var mm = String(date.getMonth() + 1).padStart(2, '0'); //January is 0!
          var yyyy = date.getFullYear();
          return yyyy + '-' + mm + '-' + dd;
      }
      
      function getDateFromTodayPlus(numberOfDays)
      {
          const d = new Date();
          d.setDate(d.getDate() + numberOfDays);
          return formatDate(d);
      }
      
      const TenDaysAgoString = getDateFromTodayPlus(-10);
      
      const TenDaysAfterString = getDateFromTodayPlus(10);
      
      // And then, in your filter :
      
      var eventParsed = JSON.parse(eventsObjects).filter(({
          date
      }) => TenDaysAgoString <= date && date <= TenDaysAfterString);
      

      【讨论】:

      • 工作,虽然我去了一个更精简的解决方案。谢谢
      【解决方案3】:

      数据是否排序?因为通过使用二进制搜索并挑选出连续范围,这是一个非常简单的选择。如果它没有排序并且排序不可行,那么您可以使用 JS 日期对象来确定过滤时日期是否在您的范围内。

      check if one date is between two dates (javascript)

      但是,如果您需要大量选择这个范围,那么首先对其进行排序并针对区间末端进行更快的二分搜索会更好。

      【讨论】:

        【解决方案4】:

        简单!你实际上拥有大部分 这将在一系列日期之间过滤, 您只需要获取“10 天前”日期和今天的日期并过滤这些日期之间的任何内容。

        //start date ten days ago
        var startDate = new Date();
        startDate.setDate(startDate.getDate() - 10);
        //today
        var endDate= new Date(); 
        
        var filteredDates= JSON.parse(eventsObjects).filter(
           ({date}) => 
               date >= startDate && date <= endDate
        );
        

        【讨论】:

          【解决方案5】:

          假设您解析的 JSON 字符串包含作为字符串的日期,并且这些日期在结果对象中仍表示为字符串,您可以像这样进行过滤:

          const eventsObjects=[{a:123, date:'2019-10-02'},{a:1123, date:'2019-10-03'},{a:11123, date:'2019-10-09'},{a:111123, date:'2019-10-12'},{a:444123, date:'2019-10-13'},{a:44123, date:'2019-10-31'},{a:4123, date:'2019-11-09'},{a:5123, date:'2019-12-13'}];
          
          var fmt=days=>{ 
           var dat=new Date((new Date()).getTime()+days*86400000);
           var dd = String(dat.getDate()).padStart(2, '0'),
               mm = String(dat.getMonth() + 1).padStart(2, '0'),
             yyyy = dat.getFullYear();
           return yyyy+'-'+mm+'-'+dd;
          }
          var d1=fmt(-10), d2=fmt(10); 
          var eventParsed = eventsObjects.filter(({date}) =>
           (date>=d1 && date<=d2) );
          
          
          console.log(eventParsed);

          在这种方法中,我只从当前日期对象生成日期字符串一次(加减 10 天)。然后通过比较简单的(日期)字符串进行过滤。

          【讨论】:

            猜你喜欢
            • 2021-05-25
            • 1970-01-01
            • 2015-10-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多