如何在JavaScript中获取日期范围之间的重复周日期计数?

如何在JavaScript中获取日期范围之间的重复周日期计数?,javascript,arrays,date,Javascript,Arrays,Date,我有一系列的日期范围,从中我需要知道全年每周有多少人工作 Eg: mainArray = ['01-01-2020','31-12-2020']; //year range dateRanges = [ [01-01-2020, 03-01-2020], //week 1 [03-01-2020, 06-01-2020], //week 1 and 2 [09-01-2020, 09-01-2020], //week 2 [10-01-2020, 11-01-2020], //

我有一系列的日期范围,从中我需要知道全年每周有多少人工作

Eg: mainArray = ['01-01-2020','31-12-2020']; //year range

dateRanges = [
  [01-01-2020, 03-01-2020], //week 1
  [03-01-2020, 06-01-2020], //week 1 and 2
  [09-01-2020, 09-01-2020], //week 2
  [10-01-2020, 11-01-2020], //week 2
  [22-01-2020, 23-01-2020], //week 4
  ....
];

//first we need to find all the weeks from the mainArray date-range 

//then calculate the weeks colliding in the dateRanges array.

the output should be =>

workLoadInWeeks = [2,3,0,1,0,0,0,0,......,0];
let weeks = dateRanges.map(s => s.map(d => this.getWeek(d)));

let distinctWeeks = weeks.map(s => 
    s.filter((item, pos) => s.indexOf(item) == pos)).flatMap(s => s);

let personPerWeek = distinctWeeks.reduce((a, c)=> {
    a[c] = a[c] || 0;
    a[c] += 1;
    return a;
},{})

const weekCount = getISOWeeks(2020);
let personsPerWeeks = [];

getWorkWeeks = (workWeeks, weekCount) => {
    for (let index = 1; index <= weekCount; index++) {
        let personCount = personPerWeek[index] || 0;
        workWeeks.push(personCount);
    }
    return workWeeks;
}
说明: 由于2020年1月3日(第1周的日期)在第1和第2个数组索引中重复,因此输出的第一个值为2

由于第2周的日期在dateRanges[1]、dateRanges[2]、dateRanges[3]中重复,因此输出的第二个值为3

因为没有人在第三周工作,所以在输出数组中为0

周开始-周日, 每周7天,
我希望周日期范围从1月1日开始,因此第一周将是部分周,因为第一周是星期三


这听起来可能令人困惑。我已经尽力解释了。

检查这是否适合您

dateRanges=[
[“01-01-2020”,“03-01-2020”],//第1周
[“03-01-2020”,“06-01-2020”],//第1周和第2周
[“09-01-2020”,“09-01-2020”],//第2周
[“10-01-2020”,“11-01-2020”],//第2周
[“22-01-2020”,“23-01-2020”],//第4周
];
mainArray=['01-01-2020','31-12-2020'];
//console.log(日期范围);
功能差异周数(dt2、dt1)
{
var diff=(dt2.getTime()-dt1.getTime())/1000;
差异/=(60*60*24*7);
返回Math.abs(Math.round(diff));
}
//对于(var i=0;i
我们需要:

以及一个获取周数的函数:

function getWeek(date_string) {
    let [d, M, y] = date_string.split(/[- :]/);
    let passedDate = new Date(y, parseInt(M) - 1, d);
    let onejan = new Date(passedDate.getFullYear(), 0, 1);
    week = Math.ceil( (((passedDate - onejan) / 86400000) + onejan.getDay() + 1) / 7 );
    return week;
} 
在这周之后,我们每周统计人数。然后我们可以计算出一年中每周有多少人工作

Eg: mainArray = ['01-01-2020','31-12-2020']; //year range

dateRanges = [
  [01-01-2020, 03-01-2020], //week 1
  [03-01-2020, 06-01-2020], //week 1 and 2
  [09-01-2020, 09-01-2020], //week 2
  [10-01-2020, 11-01-2020], //week 2
  [22-01-2020, 23-01-2020], //week 4
  ....
];

//first we need to find all the weeks from the mainArray date-range 

//then calculate the weeks colliding in the dateRanges array.

the output should be =>

workLoadInWeeks = [2,3,0,1,0,0,0,0,......,0];
let weeks = dateRanges.map(s => s.map(d => this.getWeek(d)));

let distinctWeeks = weeks.map(s => 
    s.filter((item, pos) => s.indexOf(item) == pos)).flatMap(s => s);

let personPerWeek = distinctWeeks.reduce((a, c)=> {
    a[c] = a[c] || 0;
    a[c] += 1;
    return a;
},{})

const weekCount = getISOWeeks(2020);
let personsPerWeeks = [];

getWorkWeeks = (workWeeks, weekCount) => {
    for (let index = 1; index <= weekCount; index++) {
        let personCount = personPerWeek[index] || 0;
        workWeeks.push(personCount);
    }
    return workWeeks;
}
let weeks=dateRanges.map(s=>s.map(d=>this.getWeek(d));
让distinctWeeks=weeks.map(s=>
s、 过滤器((项目,位置)=>s.indexOf(项目)==pos)).flatMap(s=>s);
让personPerWeek=distinctWeeks.reduce((a,c)=>{
a[c]=a[c]| | 0;
a[c]+=1;
返回a;
},{})
const weekCount=getISOWeeks(2020年);
让personperweeks=[];
getWorkWeeks=(workWeeks,weekCount)=>{
for(让index=1;index s.map(d=>this.getWeek(d));
让distinctWeeks=weeks.map(s=>s.filter((项目,位置)=>s.indexOf(项目)==pos)).flatMap(s=>s);
让personPerWeek=distinctWeeks.reduce((a,c)=>{
a[c]=a[c]| | 0;
a[c]+=1;
返回a;
},{})
const weekCount=getISOWeeks(2020年);
让personperweeks=[];
getWorkWeeks=(workWeeks,weekCount)=>{

对于(let index=1;index@T.J.Crowder很抱歉造成混淆。我已经编辑了这个问题。如果您需要进一步的澄清,请告诉我。谢谢您看到这可以帮助您做到这一点,谢谢您的立即回复。我没有权限对您的答案进行投票。我会检查并让您知道。非常感谢。欢迎。一旦您得到足够的答案声誉:请不要投票。谢谢。如果这对您有效,也请接受。@AshikPaulI希望有一个数组作为输出,长度为52(一年中的几周)。请检查示例输出。我为
mainArray
添加的代码与您为lop使用的其他数组所做的相同。您也要这样做吗?我想您还没有理解这个问题。您的输出提供了两个日期之间的周数。但我希望在所有周范围内重复这些日期(dateRanges数组)。我将在示例中添加更多细节。抱歉造成混淆。Genius@Stepp。该死!这太复杂了。非常感谢@AshikPaul感谢你这么客气的话!我很高兴这对你有帮助!祝你有愉快的一天!