【问题标题】:Get consecutive days with momentjs使用 momentjs 获取连续天数
【发布时间】:2020-09-20 17:25:22
【问题描述】:

我有一个包含星期几的字符串:

Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday

也可以是:

Monday, Tuesday

还有:

Thursday, Friday, Saturday

我想要实现的是,如果连续 2 天以上“合并”它们并显示如下: 周一、周二、周三、周四、周五、周六、周日 - 周一至周日; 周一、周二——将保持这种状态; 星期四、星期五、星期六 - 星期四 - 星期六。

我只想使用 moment.js 或 javascript 而没有其他插件(如 range)。 提前致谢!

【问题讨论】:

  • 我认为 moment.js 在这里没有多大帮助。
  • @0stone0 解析当天并检查下一天的值是否为 +1,但未成功。
  • @D.Pardal 你有什么建议吗?
  • 你真的只是在问如何获取字符串的第一个和最后一个项目/子字符串吗?你需要moment.js 做什么?没有看到任何日期,只是一个简单的string?

标签: javascript momentjs


【解决方案1】:

我们可以使用我们的日期列表(以及隐含的索引)创建一个星期几(dow)数组。

如果日期列表是连续的,我们将替换为 Startday - Endday,但如果只有两天,我们不会打扰。

我假设这一周“结束”,例如星期一被认为是与星期日连续的。如果没有,这是一个简单的调整。我们将函数 isModularConsecutive 替换为 isConsecutive。

function isModularConsecutive(a, modulus) {
   return !isNaN(a.reduce((prev, current, index) => (index === 0 || current === ((prev + 1) % modulus) ? current: NaN)));
}

function formatDowList(input) {
    const dow = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
    let inputArray = input.split(/\s*\,\s*/);
    let actualIndexes = inputArray.map(el => dow.findIndex(d => d === el));
    if (!isModularConsecutive(actualIndexes, 7) || actualIndexes.length <= 2) { 
        return input;
    }
    return inputArray[0] + " - " + inputArray[inputArray.length-1];
}

/* Test the code */ 
const testInputs = ["Monday, Thursday, Friday", "Monday, Tuesday, Wednesday, Thursday, Friday", "Monday, Tuesday, Wednesday", "Sunday, Monday, Tuesday, Wednesday", "Monday, Wednesday", ];
testInputs.forEach(input => console.log("Input: '" + input + "'.", "Result: '"  + formatDowList(input) + "'"))

【讨论】:

    【解决方案2】:

    这似乎工作得很好。

    const weekDaysMap = new Map([
      ["Monday", 0],
      ["Tuesday", 1],
      ["Wednesday", 2],
      ["Thursday", 3],
      ["Friday", 4],
      ["Saturday", 5],
      ["Sunday", 6]
    ]);
    
    function getDayRanges(days) {
      const ranges = [];
      let range = [days[0]], d = weekDaysMap.get(days[0]);
      for (let i = 1; i < days.length; i++) {
        if (d !== (d = weekDaysMap.get(days[i])) - 1) {
          range.push(days[i-1]);
          ranges.push(range);
          range = [days[i]];
        }
      }
      range.push(days[days.length-1]);
      ranges.push(range);
      return ranges;
    }
    
    
    console.log(getDayRanges(["Monday", "Tuesday", "Wednesday", "Saturday", "Sunday"]).map( r => r.join("–")).join(", "))

    解释:首先我们创建一个Map,将星期几转换为它们的索引。然后我们创建一个ranges 数组来存储开始-结束天数对。我们还定义了当前range 和当前日期索引d。我们遍历数组中提供的星期几,如果数组中的前一天不是顺序中的前一天,则数组中的前一天是范围的结尾,数组中的当前日期是一个新的开始。

    然后使用 em dash 连接每个范围,并使用逗号连接范围。 (从[[Monday, Wednesday], [Saturday, Sunday]]Monday–Wednesday, Saturday–Sunday。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-05
      • 2017-09-18
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多