使用Moment/Day.js库比较JS数组日期,校验5年范围
日期间隔校验实现方案
需求说明
比较数组中的两个日期值,若日期间隔超过5年则显示错误提示,要求实现无硬编码的逻辑。
给定数组示例
const filterAry = [ {type: 'date', name: 'fromDate', value:['15/02/2017']}, {type: 'date', name: 'toDate', value:['15/02/2023']}, {type: 'string', name: 'code', value:'new role'} ];
当前问题
使用Moment.js筛选日期项并计算差值的代码无法正常运行,且存在硬编码判断字段名的问题,需要优化实现逻辑。
解决方案代码
// 1. 筛选所有类型为date的项 const dateItems = filterAry.filter(item => item.type === 'date'); // 2. 将日期项转换为键值对映射(name为键,moment日期对象为值) const dateMap = dateItems.reduce((map, item) => { // 解析日期并校验有效性 const date = moment(item.value[0], 'DD/MM/YYYY'); if (!date.isValid()) { console.error(`错误:无效日期格式 - ${item.value[0]}`); return map; } map[item.name] = date; return map; }, {}); // 3. 校验两个日期是否存在并计算间隔 if (dateMap.fromDate && dateMap.toDate) { // 计算精确年数差值(第三个参数true返回小数,避免整年截断) const yearDifference = dateMap.toDate.diff(dateMap.fromDate, 'years', true); if (yearDifference > 5) { console.error('错误:日期间隔超过5年'); // 此处可替换为项目实际的错误提示逻辑(如弹窗、表单提示等) } }
代码说明
- 无硬编码实现:通过
reduce将日期项转换为键值对映射,无需硬编码判断fromDate/toDate字段名,后续扩展其他日期字段时无需修改逻辑 - 日期有效性校验:添加
isValid()判断,避免无效日期格式导致的计算错误 - 精确差值计算:使用
diff方法的第三个参数true获取包含小数的年数差值,避免出现「差5年1天却被判定为5年」的误差 - 逻辑解耦:将筛选、映射、校验、计算拆分,代码更易维护和扩展
内容的提问来源于stack exchange,提问作者user1881845
相关产品推荐
相关产品推荐

