查找两个日期对象集合中的匹配对象

问题描述:

我有两个对象集合。我想知道dates中的哪些日期对象与ranges中的日期匹配。查找两个日期对象集合中的匹配对象

只有一天是重要的,而不是几小时/分钟。我使用Moment.js来比较天moment(obj.date).isSame(otherObj.date, 'day')

我应该使用链式过滤器来查找匹配的对象吗?或循环中的某种循环?如果这是一个初学者问题,我很抱歉,但我有点迷失在这里。

dates = [ 
    {date: Mon Aug 29 2016 00:00:00 GMT+0200 (CEST)}, 
    {date: Tue Aug 30 2016 00:00:00 GMT+0200 (CEST)}, 
    {date: Wed Aug 31 2016 00:00:00 GMT+0200 (CEST)} 
    etc... 
] 

ranges = [ 
    {from: Tue Aug 30 2016 07:30:00 GMT+0200, to: Tue Aug 30 2016 08:30:00 GMT+0200}, 
    {from: Tue Aug 30 2016 09:30:00 GMT+0200, to: Tue Aug 30 2016 10:30:00 GMT+0200}, 
    {from: Wed Aug 31 2016 04:00:00 GMT+0200, to: Wed Aug 31 2016 05:00:00 GMT+0200} 
    etc... 
] 
+1

是的,'filter' +'some'应该做的。尝试一下! – Bergi

+0

很确定代码不起作用。它应该是'日期= []'不'日期= {}',对吧? –

+0

当然,对不起。 –

您正在使用范围,因此仅检查范围的两端以确定日期是否在范围内是不够的。

既然你已经提到过使用Moment,你可以看看一个名为moment-range的插件。有了这个,你会使用ranges简单地构建范围数组,然后符合使用由moment-range提供.contains()方法从dates每日期:

ranges = ranges.map((range) => moment.range(range.from, range.to)); 

dates.forEach((dateObj) => { 
    dateObj.matchingRanges = ranges.filter((range) => 
     range.contains(dateObj.date) 
    ) 
}); 

(与此代码,就可以访问每使用dates[index].matchingRanges日期每匹配范围)

+0

谢谢你,但我已经理解的比较部分(我甚至可以比较'from'部分)。我的问题是如何遍历集合。 –

+1

我的代码片段显示如何迭代和查找所有匹配的范围。您可以提供自己的比较器来代替''range.contains(dateObj.date)''行(请注意这使用[Arrow functions](https://developer.mozilla.org/en-US/docs/Web/) JavaScript/Reference/Functions/Arrow_functions),但它不是必需的 - 你也可以使用常规的匿名函数)。 – mdziekon

+1

@mdziekon:我猜你应该只是在OP的问题中提出要比较的问题 – Bergi