从带有两个分隔符的字符串中推断天数

Extrapolate days from string with two delimeters

我有这样的字符串:

周一至周四、周日

我想使用 javascript / jquery 将其转换为以下内容:

周一、周二、周三、周四、周日

有人知道如何做到这一点吗?

抱歉@jonmrich 我之前没有在这里发帖。我不知道我必须分享我已经调查过的内容。

我看了几个其他的 stack Overflow questions/solutions 特别是

From Jquery how to determine split delimiter?

但不知道从哪里开始。

下次我会做得更好...谢谢提醒。

解决方案

  • 创建一个包含日期缩写名称的数组。这在下面的示例中称为 dayNames
  • 我们要推断的字符串称为 days,由天数范围组成,用逗号分隔。
  • 已创建一个新数组 dayCodes 来存储相关日期的索引。此代码遍历范围(在本例中为 Mon-Thur 和 Sun)并为特定范围创建参数。如果范围只有一天,则其起始值将等于其结束值。该数组将填充 dayNames 数组中包含这些项目的索引。
  • 刚刚创建了一个名为 matchedDays 的新数组,用于将索引映射到日期名称。迭代日期代码 (0-6) 并将与我们的代码匹配的 dayNames 数组的一部分推送到新数组。 slice 函数在这里非常方便。
  • 由于这是一个多维数组,我们想将其展平。你可以用 arr.reduce((a,b) => a.concat(b))

Fiddle

var dayNames = ["Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun"];
var days = "Mon - Thu, Sun"
var dayCodes = [];
var ranges = days.replace(/\s/g, "").split(",");
for (var i = 0; i < ranges.length; i++) {
    var parameters = ranges[i].split('-');
    var start = parameters[0];
    var end = parameters.length == 2 ? parameters[1] : start;
    dayCodes.push([dayNames.indexOf(start),  dayNames.indexOf(end)]);
}

var matchedDays = [];
for (var i = 0; i < dayCodes.length; i++) {
    if (dayCodes[i].length == 2) {
        matchedDays.push(dayNames.slice(dayCodes[i][0], dayCodes[i][1] + 1));
    }
  else {
      matchedDays.push(dayNames[dayCodes[i][0]]); 
  }
}

matchedDays = matchedDays.reduce((a,b) => a.concat(b));
console.log(matchedDays.join(', '));