我想找到与列表中所有先前日期相邻的最后日期。
图示地:
在上图中我想要带圆圈的'日期'。
我有一个公开函数的服务(从内存中复制,因为我目前没有工作):
var maxContiguousDates = function(listOfDates1, listOfDates2){
ranges = combineDatesIntoTwixRanges(listOfDates1, listOfDates2);
//Sort with earliest start first
sortedRanges = _.sortBy(ranges,function(range){return -range.start.unix()})
return moment.max(sortedRanges.filter(function(range,index){
var currentRange = range;
var previousRange = undefined;
if(index){
previousRange = sortedRanges[index-1];
}
return previousRange?previousRange.overlap(currentRange):true;
}).end) //I don't remember the specifics I think there is a mistake in this version of the code - the copy at work runs and works for contiguous dates
}
最后的三元if语句应该确保如果没有日期是连续的,那么应该采用第一个。
然而,在我的测试中,我输入了一个非连续日期列表,它返回了最后一个总日期。
我觉得,除非我犯了一个小错误,否则这个方法应该有用。
有更好的方法吗?我没有在momentjs或twix.js中看到一个聪明的排序或连续函数。我也没有看到任何其他方式。
如果你能看出为什么这不会按预期工作,或者有更好的方法,请告诉我。
N.B。这不会通过测试,所以它不适合codereview.stackexchange.com
答案 0 :(得分:0)
问题是您没有定义方法或从过滤器中获取日期。此外,当您获得不连续的日期范围时,您的过滤器不会停止。
以下是我做的修改
var maxContiguousDate = function(listOfDates1, listOfDates2){
ranges = combineDatesIntoTwixRanges(listOfDates1, listOfDates2);
//Sort with earliest start first
sortedRanges = _.sortBy(ranges,function(range){return -range.start.unix()})
//combine all ranges if they overlap, or the previous range as a short circuit
contiguousRange = sortedRanges.reduce(function(previousRange,currentRange){
if(previousRange.overlaps(currentRange)){
return previousRange.union(currentRange);
}else{
return previousRange;
})
return contiguousRange.end;
}