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;i acc.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;i acc.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);