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

使用Moment.js过滤数组时未移除过期对象的问题排查

问题原因与解决方法

核心问题很明确:Array.prototype.filter() 是纯函数,它不会修改原数组,只会返回一个过滤后的新数组。你控制台的判断结果正确,说明断言逻辑没问题,但原数组没变化,是因为你没把filter返回的新数组存下来并使用。

错误写法示例(未接收filter返回值)

async function getAllDateStatuses() {
  // 示例原数组
  const items = [
    { id: 1, expirationDate: '2025-12-31' },
    { id: 2, expirationDate: '2023-01-01' } // 过期项
  ];

  // 仅调用filter但未保存结果,原数组不会改变
  items.filter(item => moment(item.expirationDate).isSameOrAfter(moment(), 'day'));
  console.log(items); // 输出还是原数组,包含过期对象
}

正确写法示例(接收并使用新数组)

async function getAllDateStatuses() {
  const items = [
    { id: 1, expirationDate: '2025-12-31' },
    { id: 2, expirationDate: '2023-01-01' }
  ];

  // 将过滤后的新数组赋值给变量(可覆盖原变量或用新变量)
  const validItems = items.filter(item => {
    // 用startOf('day')确保从当日0点开始比较,避免时间差误判
    const isValid = moment(item.expirationDate).isSameOrAfter(moment().startOf('day'), 'day');
    console.log(isValid); // 这里的判断结果正确
    return isValid;
  });

  console.log(validItems); // 输出过滤后的数组,不含过期对象
  return validItems; // 若需返回结果,返回新数组即可
}

额外注意事项

  • 若expirationDate是自定义格式的字符串,记得在Moment解析时指定格式,比如moment(item.expirationDate, 'YYYY-MM-DD'),避免解析错误。
  • 如果你需要修改原数组的引用,可以直接用items = items.filter(...)覆盖原变量(注意变量是否为const,const需改为let)。

内容的提问来源于stack exchange,提问作者Antonio Pavicevac-Ortiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:52:37