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

JavaScript如何验证字符串数组是否按字母或日期正确排序

问题场景

现有如下格式的字符串数组:

const array =  [
       ' | 7/9,  5:00 AM',
       ' | 7/10, 5:00 AM',
       ' | 7/10, 11:00 PM',
       ' | 7/13, 2:30 AM'
    ]

需要实现校验逻辑,判断数组是否按规则排序,不需要对数组做排序操作,仅验证现有顺序是否符合要求。初始编写的校验函数如下:

function validateScheduledGamesOrder(arrayWithAiringTimes) {
  if (arrayWithAiringTimes.length === 1) {
    return true;
  }
  for (let i = 0; i < arrayWithAiringTimes.length - 1; i++) {
    if (arrayWithAiringTimes[i] > arrayWithAiringTimes[i + 1]) {
      return true;
    } else {
      return false;
    }
  }
}
初始实现的问题
  • 循环逻辑失效:第一次元素比较就会触发return,不会遍历完整数组,只要前两个元素满足判断就直接返回结果,后续元素的顺序错乱完全检测不到
  • 判断逻辑倒置:如果校验升序规则,当前一个元素大于后一个元素时说明顺序错乱,应该返回false,原逻辑的返回值完全写反
  • 日期字符串直接比较结果不可靠:当前日期格式为M/D,直接做字符串比较时,'7/10'会因为第二位字符1的编码小于9,得到'7/10' < '7/9'的错误结论,和真实日期顺序相悖
  • 边界场景缺失:没有处理空数组入参的情况,传入空数组时函数无返回值
正确实现方案

根据校验规则的不同,分两种场景实现:

1. 通用顺序校验(适配字母、数字等可直接比较的元素)

如果是纯字母/数字数组的升序/降序校验,可以用以下通用方法:

// 校验数组是否按升序排列
function isAscSorted(arr) {
  // 空数组、单元素数组默认符合排序要求
  if (arr.length <= 1) return true;
  for (let i = 0; i < arr.length - 1; i++) {
    if (arr[i] > arr[i + 1]) return false;
  }
  return true;
}

// 校验数组是否按降序排列
function isDescSorted(arr) {
  if (arr.length <= 1) return true;
  for (let i = 0; i < arr.length - 1; i++) {
    if (arr[i] < arr[i + 1]) return false;
  }
  return true;
}

2. 适配当前日期字符串格式的校验

针对给出的带|前缀、M/D, h:mm AM/PM格式的时间数组,需要先把字符串解析为时间戳再比较,避免字符串直接比较的错误:

// 解析时间字符串为时间戳
function parseTime(timeStr) {
  // 去除固定前缀,提取纯时间内容
  const pureTime = timeStr.replace(/^\s*\|\s*/, '').trim();
  // 年份可根据业务实际场景替换为固定值,这里默认取当前年份
  return new Date(`${pureTime} ${new Date().getFullYear()}`).getTime();
}

// 校验赛事时间数组是否按时间升序排列
function validateScheduledGamesOrder(arrayWithAiringTimes) {
  if (arrayWithAiringTimes.length <= 1) return true;
  for (let i = 0; i < arrayWithAiringTimes.length - 1; i++) {
    const currentTime = parseTime(arrayWithAiringTimes[i]);
    const nextTime = parseTime(arrayWithAiringTimes[i + 1]);
    if (currentTime > nextTime) return false;
  }
  return true;
}

// 测试示例数组,返回结果为true
const testArr =  [
  ' | 7/9,  5:00 AM',
  ' | 7/10, 5:00 AM',
  ' | 7/10, 11:00 PM',
  ' | 7/13, 2:30 AM'
];
console.log(validateScheduledGamesOrder(testArr)); // true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:18:14