Javascript 仅获取数组中的未来日期

Javascript 仅获取数组中的未来日期,javascript,arrays,date,Javascript,Arrays,Date,我在数组中查找未来日期的总数,有些键没有值 我已经成功地在新数组中分隔日期,以仅获取未来的日期: let dates = resp.consultas.map(consultas => consultas.date_a); 结果: [ "2018-04-02T15:15", "2018-04-07T14:20", "2018-04-28T11:50", null, null, null, null, "2018-05-30T17:45", "2018-

我在数组中查找未来日期的总数,有些键没有值

我已经成功地在新数组中分隔日期,以仅获取未来的日期:

let dates = resp.consultas.map(consultas => consultas.date_a);
结果:

[
  "2018-04-02T15:15",
  "2018-04-07T14:20",
  "2018-04-28T11:50",
  null,
  null,
  null,
  null,
  "2018-05-30T17:45",
  "2018-04-07T16:20"
]

我如何得到刚才的日期的计数?< /p> 如果不考虑时区、无效日期字符串等情况:请使用如下:

const测试=[
“2018-04-02T15:15”,
“2018-04-07T14:20”,
“2018-04-28:11:50”,
无效的
无效的
无效的
无效的
“2018-05-30T17:45”,
“2018-04-07T16:20”
]
const currentWhenCalc=新日期()
结果=测试过滤器(功能(项目){
退货项目和新日期(项目)>currentWhenCalc
})
console.log('data',result',count',result.length)
您可以使用和清除旧日期和
空值

const日期=[
“2018-04-02T15:15”,
“2018-04-07T14:20”,
“2018-04-28:11:50”,
无效的
无效的
无效的
无效的
“2018-05-30T17:45”,
“2018-04-07T16:20”
]
const futureDates=dates.filter(日期=>time(日期).isAfter())
控制台日志(未来日期)

实际上你甚至不需要去嵌套它们。如果要筛选数组,应使用
array.filter
。它的封装外形为
(值、索引、原始数组)=>布尔值
,具有真正意义的保留和虚假意义的删除:

let currentTime = new Date();
let futureconsultas = resp.consultas.filter( consultas =>
  new Date(consultas.date_a) - currentTime > 0
);
现在,您应该有一个包含所有未来日期的数组
-需要注意的是:
new Date()-new Date('INVALID')
返回
NaN
,当与数字进行比较或屏蔽时,其计算结果为false,因此您不必担心糟糕的日期。
新日期(null)
参数导致纪元0,而纪元不在现在之前,
新日期(未定义)
导致错误日期
-第二个注意事项:您不应该在每个循环中使用
newdate()
调用。如果阵列足够大,这可能会降低执行速度。获取引用日期并使用闭包(范围)引用它

这是因为当计算两个日期时,它们的结果实际上是一个基于日期历元值的数字

一个简化的例子:

const filtration = object => object.v > 3
console.log([{v:1},{v:2},{v:3},{v:4},{v:5}].filter(filtration)) // [{v:4},{v:5}]
之后,只需检查数组上的
.length
属性即可

[1,2,3,4,5].length == 5 // true

数组在JS中的原型上有几个有用的函数,包括forEach(mutating)、filter、map、find、findIndex和

日期是示例日期(作为字符串)中的数组。数组有一个筛选器方法,它为dates数组中的每个日期执行提供的函数。然后检查该日期是否实际有一个值(非空),从数组中的字符串创建新日期以表示今天日期(dt)和日期。getTime()是一个比较“时间刻度”的方法,是比较两个日期对象的好方法。如果您的日期(将来)大于今天,则该日期将添加到新数组中,该数组将根据此条件(futureDates)过滤函数生成,最终只包含将来的元素

var futureDates = dates.filter(function(date) {
   if(date) {
     var dt = new Date();
     var df = new Date(date);
     if(df.getTime() > dt.getTime())
       return df;
     }
});

你错过了一些东西。您是否需要引用原始对象?我还注意到这些是没有时区的时间戳。您需要将它们作为本地的还是存储为UTC,并且在返回时没有正确表示?如果没有检查空值和
今天的时间(又称“now”),我会小心使用此代码是预计算的。当将
null
传递到
new Date
时,它将为您提供当前时间。这意味着您的最终结果中可能会出现null值,从今天计算值
到将
null
值与之进行比较之间会有一点延迟。感谢您更新代码以响应我的评论:)当你在Chrome/Node/FFSure中传递null到Date时,你会得到epoch 0,如果你在时间上做了很多工作,那么Moment是很好的。也就是说,对于这一点来说,这已经足够了。是的,我知道,但是因为使用
Date
至少有两个其他答案,我想提供一个替代方法。Moment是最好的JS日期库o OP可能会学到另一件事:)不要提及我正在使用Angular矩,这似乎是一个小事实。我的应用程序中已经有内置的Angular矩。因此,将其添加回库不是最好的。感谢您的回答!您可以访问矩,如果您已经使用Angular矩,则无需添加库。
如果希望在服务、控制器或指令中使用矩(),只需将矩变量注入构造函数。
just
return df.getTime()>dt.getTime()
,不需要用
换行,否则
是的,这是一个很简单的问题,我想澄清一下,而不是简明扼要的回答。你能在你的代码中提供一个解释吗?你的代码工作正常,但在部署应用程序时,typescript会标记一个错误(角度).
算术运算的左侧必须是“any”、“number”或枚举类型。
因此,请将另一个同样有效的答案标记为正确答案。谢谢!奇数。由于强制,它应该始终是用于比较的数字
var futureDates = dates.filter(function(date) {
   if(date) {
     var dt = new Date();
     var df = new Date(date);
     if(df.getTime() > dt.getTime())
       return df;
     }
});