Javascript 中涉及日期操作的嵌套循环

Nested loop involving date manipulation in Javascript

我正在开发一个预订系统,而价格取决于季节,而这些季节每年都会重复出现。到目前为止,除了反复出现的季节外,一切都很好。我正在使用 moment.js with the moment-range 插件,但这似乎并没有导致我面临的问题。因为没有其他方法可以使用具有循环范围的时刻范围,所以我想只是遍历我的 seasonsObject 并为连续五年(或任何数量)年创建新季节。这基本上就是我卡住的地方:我无法让我的循环按预期工作。

var seasonsObject = {
       low: {
          period: "low",
          seasonStart: "2017-11-01T12:01:00.000Z",
          seasonEnd: "2018-03-15T12:01:00.000Z"
       },
       high: {
         period: "high",
         seasonStart: "2018-06-01T12:01:00.000Z",
         seasonEnd: "2018-08-01T12:01:00.000Z"
       }
    }
var futureSeasons;

for (var i = 0; i < 5; i++) {
    futureSeasons = _.each(seasonsObject,(val) => { 
        val.range = moment.range(moment(val.seasonStart).add(i,'y'), moment(val.seasonEnd).add(i,'y')) 
    });
}

我测试了依赖于 moment.js 和力矩范围的部分,所以我确定我的循环没有正常工作——它似乎在 i = 0 之后中断了仍然只看到第一年​​的季节。我也尝试过使用 _.map()_.mapObject() 而不是 _.each() 但都没有成功。

然而,我的期望输出将是:

futureSeasons: {
    low0: {
        period: "low",
        seasonStart: "2017-11-01T12:01:00.000Z",
        seasonEnd: "2018-03-15T12:01:00.000Z"
    },
    high0: {
        period: "high",
        seasonStart: "2018-06-01T12:01:00.000Z",
        seasonEnd: "2018-08-01T12:01:00.000Z"
    },
    low1: {
        period: "low",
        seasonStart: "2018-11-01T12:01:00.000Z",
        seasonEnd: "2018-03-15T12:01:00.000Z"
    },
    high1: {
        period: "high",
        seasonStart: "2019-06-01T12:01:00.000Z",
        seasonEnd: "2018-08-01T12:01:00.000Z"
    },
    low2: {
        period: "low",
        seasonStart: "2020-11-01T12:01:00.000Z",
        seasonEnd: "2018-03-15T12:01:00.000Z"
    },
    high2: {
        period: "high",
        seasonStart: "2021-06-01T12:01:00.000Z",
        seasonEnd: "2018-08-01T12:01:00.000Z"
    },
    ...
}

我正在使用 Vue.js 并将尝试将该行为包装在计算的 属性 中!非常感谢任何帮助:-)

这是你想要做的吗?

window['moment-range'].extendMoment(moment);

var seasonsObject = {
  low: {
    period: "low",
    seasonStart: "2017-11-01T12:01:00.000Z",
    seasonEnd: "2018-03-15T12:01:00.000Z"
  },
  high: {
    period: "high",
    seasonStart: "2018-06-01T12:01:00.000Z",
    seasonEnd: "2018-08-01T12:01:00.000Z"
  }
}


function makeFutureSeasons(count) {
  const futureSeasons = {};
  _.range(0, count).forEach(y => {
    Object.keys(seasonsObject).forEach(k => {
      const {
        period,
        seasonStart,
        seasonEnd
      } = seasonsObject[k];

      futureSeasons[k + y] = {
        period,
        seasonStart: moment(seasonStart).add(y, 'years').toISOString(),
        seasonEnd: moment(seasonEnd).add(y, 'years').toISOString()
      };
    });
  });
  return futureSeasons;
}

const fseasons = makeFutureSeasons(5);
console.log(fseasons);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-range/3.1.1/moment-range.min.js"></script>