You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从逗号与连字符分隔的星期字符串中提取有效星期几

解析混合格式的星期几字符串

问题背景

用户通过UI选择天数时,用连字符-表示连续天数,逗号,分隔非连续天数,比如:

  • 非连续:M,W,F
  • 连续:M-F(对应周一到周五5天)
  • 混合:M-Tu,Th,Sa-Su、M-W,F-Su

需要把这类混合格式的字符串解析成所有选中的星期几列表,已经定义了常量数组DAYS: ['M', 'Tu', 'W', 'Th', 'F', 'Sa', 'Su'],但原代码的解析逻辑有问题,需要完善。

原代码的问题

  1. findIndividualDays函数返回{ ...indDays }会把数组转成键为索引的对象,应该直接返回数组
  2. SomeMethod里validDays.push(...)用法错误,push返回的是数组新长度,且map后得到的是数组的数组,需要扁平化
  3. 不需要任何内置库,基于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"]

关键逻辑说明

  1. 分割片段:先按逗号把输入拆成独立的部分,每个部分要么是单个天,要么是连续天范围
  2. 处理单个天:直接返回包含该天的数组(先校验合法性)
  3. 处理连续范围:通过DAYS数组的索引确定起始和结束位置,循环提取中间所有天数
  4. 扁平化与去重:用flat()把二维数组转成一维,再用Set去重(防止用户输入重复的天数)
  5. 合法性校验:加入对非法输入的判断,避免无效值混入结果

内容的提问来源于stack exchange,提问作者Bhupesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:52:51