Angular响应式表单搭配MomentJS时相同日期比对结果不一致是什么原因?
问题根因
- 类型不匹配:你从表单里拿到的
clone[x].fecha是ISO格式的字符串类型(从控制台输出可以看到值为"2021-10-11T05:00:00.000Z"带引号),而e.value._d是JavaScript原生Date对象,两种不同类型的值用严格相等===比较,必然返回false。 - 引用类型比较逻辑问题:哪怕两者都是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
相关产品推荐
相关产品推荐

