我正在尝试编写一个函数,该函数将改变键值对的对象,这些键值对表示一年中的每个月以及每个月的周数。示例输入如下所示,其中每个键都是月份和年份,相应的值是该月中的周数:
{ '2018-01': 4, '2018-02': 4, '2018-03': 4, '2018-04': 5 ... }我们的目标是根据'4-5-4‘模式设置每个月的周数(如果你听说过零售日历,你就知道我在说什么),还有一个可选的参数,可以在用户决定的任何月份开始这个模式。因此,如果用户决定2月份是他们的开始月份,则上面的对象将转换为:
{ '2018-01': 4 '2018-02': 4, '2018-03': 5, '2018-04': 4 ... }可以想象,在第四个键值对之后,'4-5-4‘模式再次重复。我使用moment.js将用户值的输入解析为日期( start month的可选参数是类似于“February”的输入)。我发现写这篇文章最棘手的部分是按照日历上显示的月份的顺序迭代输入对象,完全知道对象本身并不是有顺序的。我可以看到一个遥远的MVP,里面有许多嵌套的条件和循环,但我相信肯定有更有效的解决方案。
我所做的一次尝试如下所示,我导入了一个月份名称数组,确保在循环遍历对象时按顺序迭代:
if (weeksFormat === '4-4-5') {
for (let i = orderedMonthNames.indexOf(startMonth); i < orderedMonthNames.length; i += 3) {
months[moment(orderedMonthNames[i]).format('YYYY-M')] = 4
months[moment(orderedMonthNames[i + 1]).format('YYYY-M')] = 4
months[moment(orderedMonthNames[i + 2]).format('YYYY-M')] = 5
for (let x = i - 1; x >= 0; x -= 3) {
months[moment(orderedMonthNames[x]).format('YYYY-M')] = 4
months[moment(orderedMonthNames[x - 1]).format('YYYY-M')] = 4
months[moment(orderedMonthNames[x - 2]).format('YYYY-M')] = 5
}
}
}发布于 2018-08-08 06:17:38
有几件事你应该知道:
对象使用数组,应避免将
如果我理解这个问题,我会采取一种不同的方法:使用一个包含所有月份的排序数组:
const months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec',];使用函数从可选的startMonth开始重新排列月份
function rearrange(startMonth) {
const index = months.indexOf(startMonth);
const before = months.slice(0, index);
const after = months.slice(index);
return [].concat(after, before);
}使用它
rearrange(‘Feb’);
// ["Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan"]现在您可以简单地迭代并使用您的4-5-4模式,因为它是3的倍数,所以您可以使用remainder operator
const monthly = {};
const rearrangeed = rearrange('Feb');
rearrangeed.forEach(function(month, index) {
monthly[month] = (index%3 === 1) ? 5 : 4;
});
console.log(monthly)
// {Feb: 4, Mar: 5, May: 4, Jun: 4, Jul: 5, ... }最后,再次使用排序的月份数组,您可以生成包含所需内容的最终数组
const ordered = [];
months.forEach(function(monthName, index) {
const weeks = monthly[monthName];
const month = moment(monthName).format('YYYY-MM');
ordered.push({ month, weeks });
});
console.log(ordered);
// [{month: "2018-01", weeks: 4}, {month: "2018-02", weeks: 4}, {month: "2018-03", weeks: 5} … ];这对你来说有意义吗?
https://stackoverflow.com/questions/51734146
复制相似问题