Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.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_Arrays_Reduce - Fatal编程技术网

Javascript 如何获得定期间隔计数

Javascript 如何获得定期间隔计数,javascript,arrays,reduce,Javascript,Arrays,Reduce,所以我有以下格式的数据 const data = [ { date: '01-07-2019' }, { date: '02-07-2019' }, { date: '03-07-2019' }, { date: '04-07-2019' }, { date: '05-07-2019' }, { date: '06-07-2019' }, { date: '07-07-2019' }, { date: '08-07-2019' }, { date: '09-0

所以我有以下格式的数据

const data = [
  { date: '01-07-2019' },
  { date: '02-07-2019' },
  { date: '03-07-2019' },
  { date: '04-07-2019' },
  { date: '05-07-2019' },
  { date: '06-07-2019' },
  { date: '07-07-2019' },
  { date: '08-07-2019' },
  { date: '09-07-2019' },
  { date: '10-07-2019' },
  { date: '15-07-2019' },
  { date: '16-07-2019' },
  { date: '20-07-2019' },
  { date: '21-07-2019' },
  { date: '22-07-2019' },
  { date: '23-07-2019' }
]
因此,我必须计算定期间隔日期。例如,在日期
{date:'10-07-2019'}
{date:'20-07-2019'}
和日期
{date:'23-07-2019'}
上,它会中断,因此计数应再次以1开始

const ouput = [{
    startDate: '01-07-2019',
    endDate: '10-07-2019',
    count: 10
}, {
    startDate: '15-07-2019',
    endDate: '16-07-2019',
    count: 2
}, {
    startDate: '20-07-2019',
    endDate: '23-07-2019',
    count: 4
}]
是我干的

const output = Object.values(data.reduce((a, { startDate, endDate }, i) => {
  const startTime = moment(data[i].date)
    const endTime = moment(data[i + 1] && data[i + 1].date)
    if (moment.duration(endTime.diff(startTime)).asDays === 1) {
    a.startDate = startDate
    a.startDate = endDate
  }
  a.count++;
  return a;
}, {}));

但这并不是我所期望的。请帮助。

我会使用函数生成器来处理所需的聚合

下面的代码将循环日期,取一对,检查开始日期是否存在,更新结束日期,并在必要时自动生成值

注释直接在下面的代码中,代码假设初始数组已经按照您提到的示例进行了排序

顺便说一句,你实际上是把最后一天算在内,而实际上,它应该比你的计数少一天。下面的函数生成器代码中提供了关于该问题的更多注释

const数据=[
{日期:'01-07-2019'},
{日期:'02-07-2019'},
{日期:'03-07-2019'},
{日期:'04-07-2019'},
{日期:'05-07-2019'},
{日期:'06-07-2019'},
{日期:'07-07-2019'},
{日期:'08-07-2019'},
{日期:'09-07-2019'},
{日期:'10-07-2019'},
{日期:'15-07-2019'},
{日期:'16-07-2019'},
{日期:'20-07-2019'},
{日期:'21-07-2019'},
{日期:'22-07-2019'},
{日期:'23-07-2019'}
];
//计算连续日期的间隔。
函数*计数间隔(日期){
//声明一个初始累加器。
设acc={
计数:0
};
for(设i=0;iacc.count++;//我会使用函数生成器来处理所需的聚合

下面的代码将循环日期,取一对,检查开始日期是否存在,更新结束日期,并在必要时自动生成值

注释直接在下面的代码中,代码假设初始数组已经按照您提到的示例进行了排序

作为旁注,您实际上在计数中包含了最后一个日期,而实际上,它应该比您的计数少一天。下面的函数生成器代码中提供了关于这一点的更多注释

const数据=[
{日期:'01-07-2019'},
{日期:'02-07-2019'},
{日期:'03-07-2019'},
{日期:'04-07-2019'},
{日期:'05-07-2019'},
{日期:'06-07-2019'},
{日期:'07-07-2019'},
{日期:'08-07-2019'},
{日期:'09-07-2019'},
{日期:'10-07-2019'},
{日期:'15-07-2019'},
{日期:'16-07-2019'},
{日期:'20-07-2019'},
{日期:'21-07-2019'},
{日期:'22-07-2019'},
{日期:'23-07-2019'}
];
//计算连续日期的间隔。
函数*计数间隔(日期){
//声明一个初始累加器。
设acc={
计数:0
};
for(设i=0;iacc.count++;//给你,试试这个

const data = [
          { date: "01-07-2019" },
          { date: "02-07-2019" },
          { date: "03-07-2019" },
          { date: "04-07-2019" },
          { date: "05-07-2019" },
          { date: "06-07-2019" },
          { date: "07-07-2019" },
          { date: "08-07-2019" },
          { date: "09-07-2019" },
          { date: "10-07-2019" },
          { date: "15-07-2019" },
          { date: "16-07-2019" },
          { date: "20-07-2019" },
          { date: "21-07-2019" },
          { date: "22-07-2019" },
          { date: "23-07-2019" }
        ];
函数来解析日期

函数获取日期差

所需输出


给你,试试这个

const data = [
          { date: "01-07-2019" },
          { date: "02-07-2019" },
          { date: "03-07-2019" },
          { date: "04-07-2019" },
          { date: "05-07-2019" },
          { date: "06-07-2019" },
          { date: "07-07-2019" },
          { date: "08-07-2019" },
          { date: "09-07-2019" },
          { date: "10-07-2019" },
          { date: "15-07-2019" },
          { date: "16-07-2019" },
          { date: "20-07-2019" },
          { date: "21-07-2019" },
          { date: "22-07-2019" },
          { date: "23-07-2019" }
        ];
函数来解析日期

函数获取日期差

所需输出


另一种可能的解决办法

const parseDate=(str)=>{
常数[d,m,y]=str.split('-');
返回+新日期(y,m-1,d)
}
常量输出=数据减少((a{
日期
},i)=>{
const cur=parseDate(日期);
const lastDate=data[i-1]和&data[i-1].date | | date;
const last=parseDate(lastDate | | date);
如果(cur-last>1000*60*60*24)a.push({count:0});
常数{
startDate=日期,
计数
}=a.pop();
a、 推({
开始日期,
结束日期:日期,
计数:计数+1
})
返回a;
}, [{
计数:0
}])
console.log(输出)

常数数据=[
{日期:'01-07-2019'},
{日期:'02-07-2019'},
{日期:'03-07-2019'},
{日期:'04-07-2019'},
{日期:'05-07-2019'},
{日期:'06-07-2019'},
{日期:'07-07-2019'},
{日期:'08-07-2019'},
{日期:'09-07-2019'},
{日期:'10-07-2019'},
{日期:'15-07-2019'},
{日期:'16-07-2019'},
{日期:'20-07-2019'},
{日期:'21-07-2019'},
{日期:'22-07-2019'},
{日期:'23-07-2019'}

]
另一种可能的解决方案

const parseDate=(str)=>{
常数[d,m,y]=str.split('-');
返回+新日期(y,m-1,d)
}
常量输出=数据减少((a{
日期
},i)=>{
const cur=parseDate(日期);
const lastDate=data[i-1]和&data[i-1].date | | date;
const last=parseDate(lastDate | | date);
如果(cur-last>1000*60*60*24)a.push({count:0});
常数{
startDate=日期,
计数
}=a.pop();
a、 推({
function dateDiff(date1, date2) {
  date1 = parseDate(date1);
  date2 = parseDate(date2);
  let diffTime = Math.abs(date2.getTime() - date1.getTime());
  let diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
  return diffDays;
}
const output =  data.reduce(function(resultSet, currentValue, currentIndex, arr) {

  if (resultSet.length == 0) {
    resultSet.push({
      startDate: currentValue.date,
      endDate: currentValue.date,
      count: 1
    });
  }
  else{

    let dateDiffrence = dateDiff(resultSet[resultSet.length-1].endDate, currentValue.date);
    console.log(dateDiffrence);
    if(dateDiffrence == 1){
        resultSet[resultSet.length-1].endDate = currentValue.date;
        resultSet[resultSet.length-1].count++;
    }else{
        resultSet.push({
            startDate: currentValue.date,
            endDate: currentValue.date,
            count: 1
          });
    }

  }
  return resultSet;
}, []);
// initially lets assume first date is the start as well as end date
var dateIntervalObject = {
  startDate: data[0].date,
  endDate: data[0].date,
  count: 1
};

var result = data.reduce((resultArray, obj, i) => {
  if(i > 0) {
    var startTime = moment(dateIntervalObject.endDate, "DD-MM-YYYY");
    var endTime = moment(obj.date, "DD-MM-YYYY");
    if (endTime.diff(startTime, 'days') === 1) {
      dateIntervalObject.endDate = obj.date;
      dateIntervalObject.count += 1;
      // remove the latest object in array, to replace with new
      resultArray.pop();
    } else {
        dateIntervalObject = {
        startDate: obj.date,
        endDate: obj.date,
        count: 1
      };
    }
    // push the date Interval object in the array
    resultArray.push(dateIntervalObject);
  }
  return resultArray;
}, [dateIntervalObject]);

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