如何从逗号与连字符分隔的星期字符串中提取有效星期几
解析混合格式的星期几字符串
问题背景
用户通过UI选择天数时,用连字符-表示连续天数,逗号,分隔非连续天数,比如:
- 非连续:
M,W,F - 连续:
M-F(对应周一到周五5天) - 混合:
M-Tu,Th,Sa-Su、M-W,F-Su
需要把这类混合格式的字符串解析成所有选中的星期几列表,已经定义了常量数组DAYS: ['M', 'Tu', 'W', 'Th', 'F', 'Sa', 'Su'],但原代码的解析逻辑有问题,需要完善。
原代码的问题
findIndividualDays函数返回{ ...indDays }会把数组转成键为索引的对象,应该直接返回数组SomeMethod里validDays.push(...)用法错误,push返回的是数组新长度,且map后得到的是数组的数组,需要扁平化- 不需要任何内置库,基于
DAYS的索引就能完成解析
修正后的完整实现
const DAYS = ['M', 'Tu', 'W', 'Th', 'F', 'Sa', 'Su']; function parseDaysInput(userInput) { if (!userInput) return []; // 按逗号分割成多个片段(每个片段是单个天或连续天范围) const segments = userInput.split(','); // 处理每个片段,得到所有天数的二维数组 const allDays = segments.map(segment => { const parts = segment.split('-'); // 单个天数的情况 if (parts.length === 1) { const day = parts[0].trim(); // 校验是否是有效天数,避免非法输入 return DAYS.includes(day) ? [day] : []; } // 连续天数范围的情况 else if (parts.length === 2) { const startDay = parts[0].trim(); const endDay = parts[1].trim(); const startIndex = DAYS.indexOf(startDay); const endIndex = DAYS.indexOf(endDay); // 校验起始和结束天数是否有效,且起始索引不大于结束索引 if (startIndex === -1 || endIndex === -1 || startIndex > endIndex) { return []; } // 提取从start到end的所有天数 const rangeDays = []; for (let i = startIndex; i <= endIndex; i++) { rangeDays.push(DAYS[i]); } return rangeDays; } // 非法格式的片段(比如超过一个连字符) else { return []; } }); // 扁平化二维数组,得到最终的有效天数列表,同时去重(可选,避免重复输入) return [...new Set(allDays.flat())]; } // 测试示例 console.log(parseDaysInput('M-Tu,Th,Sa-Su')); // 输出: ["M", "Tu", "Th", "Sa", "Su"] console.log(parseDaysInput('M-W,F-Su')); // 输出: ["M", "Tu", "W", "F", "Sa", "Su"] console.log(parseDaysInput('M,F')); // 输出: ["M", "F"]
关键逻辑说明
- 分割片段:先按逗号把输入拆成独立的部分,每个部分要么是单个天,要么是连续天范围
- 处理单个天:直接返回包含该天的数组(先校验合法性)
- 处理连续范围:通过
DAYS数组的索引确定起始和结束位置,循环提取中间所有天数 - 扁平化与去重:用
flat()把二维数组转成一维,再用Set去重(防止用户输入重复的天数) - 合法性校验:加入对非法输入的判断,避免无效值混入结果
内容的提问来源于stack exchange,提问作者Bhupesh
相关产品推荐
相关产品推荐

