从带有两个分隔符的字符串中推断天数
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(', '));
我有这样的字符串:
周一至周四、周日
我想使用 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(', '));