momentjs 在两周内迭代日期并将日期映射到现有数组

momentjs iterate over dates in a two week period and map the date to existing array

我有一个数组,其中的对象具有两个属性,'location' 和 'needs'。 needs 属性 有一个包含日期和计数的对象数组 {date: "2021-06-15", count: 10} 所以数组看起来像这样:

{
"location": "NYC",
"needs": [
    {
        "date": "2021-04-06",
        "count": 56
    },
    {
        "date": "2021-04-13",
        "count": 10
    }
  ]
}

我需要做的是用Momentjs使用今天的日期,计算出从今天开始的两周时间段,然后将needs-count映射到moment循环中的日期。如果缺少日期(如下例所示),则应将 0 作为 count

最终数组看起来像...

{
"location": "NYC",
"needs": [
    {
        "date": "2021-04-06",
        "count": 56            // this had a count in the initial object
    },
    {
        "date": "2021-04-07",
        "count": 0
    },
    {
        "date": "2021-04-08",
        "count": 0
    },
    {
        "date": "2021-04-09",
        "count": 0
    },
    {
        "date": "2021-04-10",
        "count": 0
    },
    {
        "date": "2021-04-11",
        "count": 0
    },
    {
        "date": "2021-04-12",
        "count": 0
    },
    {
        "date": "2021-04-13",
        "count": 10             // this had a count in the initial object
    },
    ...
    ...
    ...
  ]
}

就功能而言,我得到的最接近的是

    let startDay = moment().format('YYYY-MM-DD');
    let endDay = moment().add(14, 'days').format('YYYY-MM-DD');

    let startDate = moment(startDay);
    let endDate = moment(endDay);
    let datesBetween = [];

    let startingMoment = startDate;
    while(startingMoment <= endDate) {
      for (let count = 0; count < 15; count ++) {
        // at this point im trying to take 'week' which has the location property and needs property and trying to merge them together... but failed miserably.
        if (week.needs[count].date === startingMoment) {
          datesBetween.push([startingMoment.clone(), week.needs[count].count]);// clone to add new object
          startingMoment.add(1, 'days');
        } else {
          datesBetween.push([startingMoment.clone(), 0]);// clone to add new object
        }
      }
    }

谁能看出我哪里错了?

你可以这样做:

let dates = {
"location": "NYC",
"needs": [
    {
        "date": "2021-04-06",
        "count": 56
    },
    {
        "date": "2021-04-13",
        "count": 10
    }
  ]
};

let day = moment();

for( let i=0; i< 15; i++){
    let date = day.add(1, "days").format("YYYY-MM-DD");
    console.log(`Looking if ${date} is in array...`)
    
    if(dates.needs.find(obj => obj.date === date)) continue;
    
    console.log(`Adding ${date}`)
    dates.needs.push({ date, count : 0 })
}

dates.needs.sort( (a,b) => a.date > b.date ? 1: -1 );

console.log(dates)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

const week = {
"location": "NYC",
"needs": [
    {
        "date": "2021-04-06",
        "count": 56
    },
    {
        "date": "2021-04-13",
        "count": 10
    }
  ]
}

let current = moment();
const allDates = [];
const FORMAT = 'YYYY-MM-DD';

for (let count = 0; count < 14; count++) {
  const found = week.needs.find(i => i.date === current.format(FORMAT));
  if (found) {
    allDates.push(found);
  } else {
    allDates.push({
      date: current.format(FORMAT),
      count: 0,
    });
  }
  current.add(1, 'day');
}

week.needs = allDates;
console.log(week);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous"></script>