JavaScript日期数组过滤报错或返回空结果问题求助
问题分析与解决方法
核心问题原因
days.filter is not a function错误:days并非标准数组,大概率是构建days时操作错误——比如将日期区间数组作为单个元素推入days(导致days变成二维数组),或enumerateDaysBetweenDates函数返回非数组类型,使得days失去数组方法。- 过滤返回空数组:根源有两点:
departure、rback的元素是除法表达式(如09/06/2023被解析为9/6/2023的小数结果),而非日期字符串,导致Moment无法解析出有效日期对象。- 过滤函数
checkd逻辑错误(比如未考虑Moment月份是0基索引,误将6月判断为month() === 6)。
分步解决方法
1. 修复日期格式问题
确保JavaScript中departure、rback的元素是日期字符串,而非数字运算结果:
- PHP端输出数组时,使用
json_encode格式化,自动将日期包裹为字符串(避免直接输出09/06/2023被JS解析为除法)。示例:<?php $dates = [ 'departure' => ['09/06/2023', '01/06/2023'], 'rback' => ['15/06/2023', '02/06/2023'], 'number' => [2] ]; echo json_encode($dates); ?> - JS端通过
JSON.parse接收,确保拿到的是字符串类型的日期。
2. 正确构建days数组
先实现可靠的日期区间遍历函数,再将区间日期展开推入days:
// 基于Moment.js的日期区间遍历函数 function enumerateDaysBetweenDates(startStr, endStr) { const start = moment(startStr, 'DD/MM/YYYY'); const end = moment(endStr, 'DD/MM/YYYY'); const dateList = []; let currentDate = start.clone(); while (currentDate.isSameOrBefore(end)) { dateList.push(currentDate.clone()); currentDate.add(1, 'day'); } return dateList; } // 构建一维日期数组 const days = []; for (let i = 0; i < number.length; i++) { const intervalDates = enumerateDaysBetweenDates(departure[i], rback[i]); days.push(...intervalDates); // 展开子数组,避免嵌套 }
3. 正确过滤6月日期并提取日数
注意Moment的月份是0基索引(6月对应month() === 5),同时补零保证两位格式:
// 过滤6月日期的判断函数 const isJune = (date) => date.month() === 5; // 提取日数并格式化 const juneDayNumbers = days.filter(isJune).map(date => { const day = date.date(); return day < 10 ? `0${day}` : `${day}`; }); // 最终结果示例:["09","10","11","12","13","14","15","01","02"] // 若需要数字类型数组,可转为:juneDayNumbers.map(Number)
内容的提问来源于stack exchange,提问作者GigiF
相关产品推荐
相关产品推荐

