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
相关产品推荐
相关产品推荐

