【问题标题】:Array.some() is always false even if the condition is met即使满足条件,Array.some() 也始终为 false
【发布时间】:2020-06-29 22:48:19
【问题描述】:

我正在尝试编写一个函数来获取表示日期的字符串数组,然后检查给定日期是否在数组中。但是,即使满足条件,我也总是收到false

这是一个最小的代码:

let dates = ['2020-06-29', '2020-07-13'];
dates = dates.map(some_day => new Date(some_day));
const someDay = new Date(2020, 5, 29);
console.log(dates.some(some_day => some_day.getTime() === someDay.getTime()));

编辑 1:(仍然无法正常工作,但我正在改进代码)

let dates = ['2020-06-29', '2020-07-13'];
dates = dates.map(some_day => new Date(some_day));
let someDay = new Date(2020, 5, 29);
const date_string = `${someDay.getFullYear()}-${someDay.getMonth() + 1}-${someDay.getDate()}`;
someDay = new Date(date_string);
console.log(dates.some(some_day => some_day.getTime() === someDay.getTime()));

【问题讨论】:

  • 时间会有所不同。 console.log() 你会看到
  • 传递日期字符串和传递单个日期组件会导致不同的行为,特别是关于时区。由于时区不同,getTime()的值不同,所以结果不匹配。
  • 伙计们,JS 中的月份从 0 开始作为一月。
  • 没有相等的日期。时区可能不同。但是,最好使用moment.js 之类的东西来防止错误。
  • @VLAZ,你读过 Stockafisso 的评论了吗?另外,我很确定只声明“数组中没有相等的元素”并且没有进一步信息的 cmets 犯了同样的错误。

标签: javascript arrays


【解决方案1】:

由于时区不同,要么操作 timezoneoffset,要么:

dates.some(some_day => 
  (
    (some_day.getFullYear() === someDay.getFullYear()) &&
    (some_day.getMonth() === someDay.getMonth()) &&
    (some_day.getDate() === someDay.getDate())
  )
)

【讨论】:

  • 像其他人建议的那样,我同意并认为您应该使用const someDay = new Date(2020, 5, 29); 而不是const someDay = new Date('2020-06-29');
  • 实际上我将date 作为Date 类型的对象。 github.com/fengyuanchen/datepicker#filter
  • 肯定有很多。如果你不使用Date 方法,你可以坚持使用String。要了解有关Date 的更多信息,我推荐:Date - JavaScript | MDN
  • 这实际上是一个非常糟糕的方法。它仅适用于东部时区。在西部时区,new Date('2020-06-29') 将变为 6 月 28 日,.getDate 将返回 28 日。
  • @Ambitions 这个答案意味着您的问题可以通过更改比较日期的方式来解决,但您的问题在于创建,而不是比较。避免使用字符串来创建日期,除非它采用完整的 ISO 日期格式。.getTime() 是比较日期的有效方式,因此无需在此处进行任何更改。
猜你喜欢
  • 2019-04-05
  • 1970-01-01
  • 2013-04-08
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多