如何校验对象数组日期格式并按日期升序排序?
日期格式校验与数组排序实现
需求说明
- 校验数组内所有对象的
category字段是否严格符合YYYY-MM-DD格式 - 若全部符合,将数组按日期从早到晚排序;只要有一个不符合,不执行排序操作
原代码的问题点
- 校验函数参数缺失:
checkIfDateIsInRightFormat未定义入参dateStr,且调用时传入的是整个对象而非对象的category属性 - 遍历方法拼写错误:使用了错误的
foreach,正确应为forEach - 校验结果判断逻辑错误:
every方法内的判断逻辑无效,只需直接验证每个元素是否为true即可 - 排序逻辑错误:将日期字符串直接转数字相减会得到NaN,无法正确排序;YYYY-MM-DD格式的字符串可直接按字典序比较,或通过Date对象时间戳比较
正确实现代码
1. 完善日期格式校验函数
确保格式匹配正则,同时排除无效日期(如2023-02-30这类不存在的日期)
function checkIfDateIsInRightFormat(dateStr) { // 匹配YYYY-MM-DD格式的正则 const regex = /^\d{4}-\d{2}-\d{2}$/; if (!regex.test(dateStr)) { return false; } // 验证日期合法性,排除无效日期 const date = new Date(dateStr); return date instanceof Date && !isNaN(date) && date.toISOString().slice(0, 10) === dateStr; }
2. 完整的校验与排序逻辑
const arrayData = [ { "category": "2019-07-24", "total": 1, "Col 1": 100 }, { "category": "2018-11-12", "total": 3, "Col 1": 101 }, { "category": "2019-07-11", "total": 1, "Col 1": 200 }, { "category": "2019-08-11", "total": 1, "Col 1": 153 }, { "category": "2019-09-25", "total": 1, "Col 1": 198 } ]; // 1. 校验所有category的格式 const allValid = arrayData.every(item => checkIfDateIsInRightFormat(item.category)); if (allValid) { // 2. 按日期从早到晚排序:两种可选方法 arrayData.sort((objA, objB) => { // 方法1:直接利用YYYY-MM-DD字符串的字典序特性比较 return objA.category.localeCompare(objB.category); // 方法2:通过Date时间戳比较,兼容性更强 // return new Date(objA.category).getTime() - new Date(objB.category).getTime(); }); console.log('排序后的数组:', arrayData); } else { console.log('存在不符合格式的日期,不执行排序'); }
测试用例验证
- 当数组包含非法值(如
"ABC")时,allValid为false,不会执行排序 - 全部合法时,排序结果与预期一致:
[ { "category": "2018-11-12", "total": 3, "Col 1": 101 }, { "category": "2019-07-11", "total": 1, "Col 1": 200 }, { "category": "2019-07-24", "total": 1, "Col 1": 100 }, { "category": "2019-08-11", "total": 1, "Col 1": 153 }, { "category": "2019-09-25", "total": 1, "Col 1": 198 } ]
内容的提问来源于stack exchange,提问作者Beginner_Hello
相关产品推荐
相关产品推荐

