Javascript 如何根据另一个对象中相对值的特定顺序为对象指定值?

Javascript 如何根据另一个对象中相对值的特定顺序为对象指定值?,javascript,momentjs,Javascript,Momentjs,我正在尝试编写一个函数,它将改变一个键值对对象,这些键值对表示一年中的每个月以及每个月的周数。示例输入如下所示,其中每个键都是月份和年份,相应的值是该月份的周数: { '2018-01': 4, '2018-02': 4, '2018-03': 4, '2018-04': 5 ... } 目标是根据“4-5-4”模式设置每个月的周数如果你听说过零售日历,你知道我在说什么,使用可选参数在用户决定的任何月份开始该模式。因此,如果用户决定二月是他们的开始月份,则上述对象将转换为: { '2018-

我正在尝试编写一个函数,它将改变一个键值对对象,这些键值对表示一年中的每个月以及每个月的周数。示例输入如下所示,其中每个键都是月份和年份,相应的值是该月份的周数:

 { '2018-01': 4, '2018-02': 4, '2018-03': 4, '2018-04': 5 ... }
目标是根据“4-5-4”模式设置每个月的周数如果你听说过零售日历,你知道我在说什么,使用可选参数在用户决定的任何月份开始该模式。因此,如果用户决定二月是他们的开始月份,则上述对象将转换为:

{ '2018-01': 4 '2018-02': 4, '2018-03': 5, '2018-04': 4 ... }
您可以想象,在第四个键值对之后,“4-5-4”模式再次重复。我正在使用moment.js解析用户值到日期的输入。start month的可选参数是一个类似于二月的输入。写这篇文章时,我发现最棘手的部分是按日历上显示的月份顺序遍历输入对象,充分了解对象并不是天生有序的。我可以看到一个遥远的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
        }
    }
}

您应该注意以下几点:

如果需要,对象键不可排序且对象不可编辑 为此使用数组 你应该避免变异对象 如果我理解这个问题,我会采取不同的方法: 具有包含所有月份的排序数组:

const months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec',];
使用函数重新排列从可选的开始月份开始的月份

使用它

rearrange(‘Feb’);
// ["Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan"]
现在,您可以简单地对其进行迭代并使用4-5-4模式,因为它是3的倍数,您可以使用

最后,再次使用ordered months数组,您可以生成包含所有所需内容的最终数组

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} … ];

这对您有意义吗?

请添加您的尝试。请将其添加到问题中,而不是添加到评论中。@NinaScholz谢谢:D我对问这样的问题很陌生
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} … ];