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>
我正在开发一个预订系统,而价格取决于季节,而这些季节每年都会重复出现。到目前为止,除了反复出现的季节外,一切都很好。我正在使用 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>