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

JavaScript日期数组过滤报错或返回空结果问题求助

问题分析与解决方法

核心问题原因

  1. days.filter is not a function错误:days并非标准数组,大概率是构建days时操作错误——比如将日期区间数组作为单个元素推入days(导致days变成二维数组),或enumerateDaysBetweenDates函数返回非数组类型,使得days失去数组方法。
  2. 过滤返回空数组:根源有两点:
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:56:23