首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据另一个对象中相对值的特定顺序为另一个对象赋值?

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

Stack Overflow用户
提问于 2018-08-08 03:31:11
回答 1查看 37关注 0票数 0

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

代码语言:javascript
复制
 { '2018-01': 4, '2018-02': 4, '2018-03': 4, '2018-04': 5 ... }

我们的目标是根据'4-5-4‘模式设置每个月的周数(如果你听说过零售日历,你就知道我在说什么),还有一个可选的参数,可以在用户决定的任何月份开始这个模式。因此,如果用户决定2月份是他们的开始月份,则上面的对象将转换为:

代码语言:javascript
复制
{ '2018-01': 4 '2018-02': 4, '2018-03': 5, '2018-04': 4 ... }

可以想象,在第四个键值对之后,'4-5-4‘模式再次重复。我使用moment.js将用户值的输入解析为日期( start month的可选参数是类似于“February”的输入)。我发现写这篇文章最棘手的部分是按照日历上显示的月份的顺序迭代输入对象,完全知道对象本身并不是有顺序的。我可以看到一个遥远的MVP,里面有许多嵌套的条件和循环,但我相信肯定有更有效的解决方案。

我所做的一次尝试如下所示,我导入了一个月份名称数组,确保在循环遍历对象时按顺序迭代:

代码语言:javascript
复制
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
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-08-08 06:17:38

有几件事你应该知道:

  • 对象键不可排序且对象不可迭代,您希望对该

对象使用数组,应避免将

如果我理解这个问题,我会采取一种不同的方法:使用一个包含所有月份的排序数组:

代码语言:javascript
复制
const months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec',];

使用函数从可选的startMonth开始重新排列月份

代码语言:javascript
复制
function rearrange(startMonth) {
  const index = months.indexOf(startMonth);
  const before = months.slice(0, index);
  const after = months.slice(index);
  return [].concat(after, before);
}

使用它

代码语言:javascript
复制
rearrange(‘Feb’);
// ["Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan"]

现在您可以简单地迭代并使用您的4-5-4模式,因为它是3的倍数,所以您可以使用remainder operator

代码语言:javascript
复制
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, ... }

最后,再次使用排序的月份数组,您可以生成包含所需内容的最终数组

代码语言:javascript
复制
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} … ];

这对你来说有意义吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51734146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档