【问题标题】:How to combine consecutive dates in javascript?如何在javascript中组合连续日期?
【发布时间】:2018-07-19 10:16:40
【问题描述】:

我有一个日期数组,例如:

test = [ '2018-07-18', '2018-07-19', '2018-07-21', '2018-07-23', '2018-07-24', '2018-07-26'];

我想返回一个由连续日期组成的子数组,如下所示:

result = [['2018-07-18', '2018-07-19'], ['2018-07-21'], ['2018-07-23', '2018-07-24'], ['2018-07-26']]

我正在尝试编写一个 sn-p 代码:

const moment = require('moment');
let visited = [];
const alpha = test.reduce((accumlator, current_date, current_index, array) => {
    let start_date = current_date;
    let successive_date = array[current_index + 1];
    visited.push(start_date);
    if(successive_date && moment(successive_date).diff(moment(start_date), 'days') === 1  
        && visited.includes(successive_date) === false) {
        accumlator.concat(start_date);
        accumlator.concat(successive_date);
    }
    if(successive_date && moment(successive_date).diff(moment(start_date), 'days') !== 1  
        && visited.includes(successive_date) === false) {
        accumlator.concat(successive_date);
    }
    return accumlator;
}, []);

console.log('alpha: ', alpha);

使用concat时的结果是:

alpha: []

我使用了push(),它返回一个数组,例如test

alpha:  [ '2018-07-18','2018-07-19','2018-07-21','2018-07-23','2018-07-23','2018-07-24''2018-07-26' ]

如何解决此问题以获得上述结果?

【问题讨论】:

    标签: javascript arrays momentjs


    【解决方案1】:

    你可以试试:

    test.reduce((acc, date) => {
      const group = acc[acc.length - 1];
      if (moment(date).diff(moment(group[group.length - 1] || date), 'days') > 1) {
        acc.push([date])
      } else {
        group.push(date);
      }
      return acc;
    }, [[]])
    

    输出:

    [
      [
        "2018-07-18",
        "2018-07-19"
      ],
      [
        "2018-07-21"
      ],
      [
        "2018-07-23",
        "2018-07-24"
      ],
      [
        "2018-07-26"
      ]
    ]
    

    【讨论】:

      【解决方案2】:

      如果未维护数组中日期的顺序,则以下内容会有所帮助。例如,'2018-07-18', '2018-07-19', '2018-07-17' 是连续的,但分散在数组的开头和结尾。

      var test = [ '2018-07-18', '2018-07-19', '2018-07-21', '2018-07-23', '2018-07-24', '2018-07-26', '2018-07-17'], dateformat = "YYYY-MM-DD";
      
      var result = test.reduce(function(acc,val){
          var present, date = moment(val,dateformat);
          acc.forEach(function(arr,index){
              if(present) return;
              if(arr.indexOf(date.clone().subtract(1,'day').format(dateformat))>-1 || arr.indexOf(date.clone().add(1,'day').format(dateformat))>-1)
              {
                  present = true;
                  arr.push(val);
              }
          });
          if(!present) acc.push([val]);
          return acc;
      },[]);
      
      console.log(result)
      <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

      【讨论】:

        【解决方案3】:

        您可以使用此功能,但日期应按顺序排列。

        function get_relative_dates(dates){
            var format = 'YYYY-MM-DD';
            var newDate = [];
            dates.forEach(function(date){
                var lastArr, lastDate;
                if(newDate.length){
                    lastArr = newDate[newDate.length -1];
                    if(!lastArr.length)
                        lastArr.push(date);
                    else{
                        var lastDate = lastArr[lastArr.length -1];
                        if(moment(lastDate, format).add(1,'d').format(format) == date)
                            lastArr.push(date);
                        else
                            newDate.push([date]);
                    }
                }
                else
                    newDate.push([date]);
            });
            return newDate;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-04-16
          • 1970-01-01
          • 2013-05-17
          • 2021-07-31
          • 1970-01-01
          • 2012-07-10
          • 1970-01-01
          • 2018-07-22
          • 2021-12-06
          相关资源
          最近更新 更多