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

Angular响应式表单搭配MomentJS时相同日期比对结果不一致是什么原因?

问题根因
  1. 类型不匹配:你从表单里拿到的clone[x].fecha是ISO格式的字符串类型(从控制台输出可以看到值为"2021-10-11T05:00:00.000Z"带引号),而e.value._d是JavaScript原生Date对象,两种不同类型的值用严格相等===比较,必然返回false。
  2. 引用类型比较逻辑问题:哪怕两者都是Date类型,===比较的是对象的内存引用地址,两个不同的Date实例哪怕存储的时间完全一致,也会返回false,不会按时间值进行匹配。
修复方案

将两者转换为相同的可比较基础类型即可,推荐转换为时间戳或者统一的ISO字符串进行比较,只需要修改find匹配逻辑的代码:

// 方案1:统一转ISO字符串比较(和你现有存储的fecha格式完全匹配)
const _encontrado = clone.find(element => element.fecha === e.value._d.toISOString());

// 方案2:统一转时间戳比较(更通用,不受字符串格式影响)
const _encontrado = clone.find(element => new Date(element.fecha).getTime() === e.value._d.getTime());
额外优化建议

不要直接访问Moment或者Date的私有属性(比如_d、_e这类以下划线开头的属性),这类属于库内部实现属性,后续版本迭代可能会变更导致代码失效。Angular Material datepicker的dateChange事件返回的e.value本身就是可直接操作的Date/Moment实例,可以直接调用toISOString()、getTime()等原生方法。

内容的提问来源于stack exchange,提问作者raulabad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:09:02