使用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
相关产品推荐
相关产品推荐

