Javascript 如何从序列中提取连续天数?

Javascript 如何从序列中提取连续天数?,javascript,recursion,Javascript,Recursion,我试图编写一个递归函数来查找数组中连续几天的开始和结束索引 以下是我的示例输入: var input = [ '2018-06-11', '2018-06-12', '2018-06-15', '2018-06-16', '2018-06-17', '2018-06-19' ]; 我希望我的产出是: var expectedOutput = [{ start: '2018-06-11', end: '2018-0

我试图编写一个递归函数来查找数组中连续几天的开始和结束索引

以下是我的示例输入:

var input =  [
    '2018-06-11',
    '2018-06-12',
    '2018-06-15',
    '2018-06-16',
    '2018-06-17',
    '2018-06-19'
];
我希望我的产出是:

var expectedOutput = [{
        start: '2018-06-11',
        end: '2018-06-12'
    },
    {
        start: '2018-06-15',
        end: '2018-06-17'
    },
    {
        start: '2018-06-19',
        end: '2018-06-19'
    }
];
因此,我希望找到连续几天的开始/结束日期

每一天都应该是独立的

我写了一个算法,但第一天就停止了

function extractConsecutiveDays(input, index) {

    if (input == null || input.length === 0) {
        return;
    }

    if(isConsecutiveDay(input[index], input[index + 1])) {
        return extractConsecutiveDays(input, index + 1);
    }

    var obj = {
        start: input[0],
        end: input[index]
    };

    input.splice(0, index);
    return obj;
}
这是我的小提琴:

我在上面问过你为什么想要一个递归解决方案(这个问题并不适合它),如果你愿意接受一个非递归的解决方案。如果是,请参阅评论:

function findConsecutive(array) {
    var result = [];
    var current = null;
    // Loop through building up each result, starting a new entry each
    // time we find a non-consecutive day
    array.forEach(function(entry) {
        // If this is the first pass or this entry isn't consecutive with
        // the last, start a new entry
        if (!current || !areConsecutive(current.end, entry)) {
            result.push(current = {
              start: entry,
              end: entry
            });
        } else {
            // It's consecutive, just extend the last one
            current.end = entry;
        }
    });
    return result;
}
实例:

var输入=[
'2018-06-11',
'2018-06-12',
'2018-06-15',
'2018-06-16',
'2018-06-17',
'2018-06-19'
];
//我认为这种“连续的”实现在DST中是可靠的
//界限(http://jsfiddle.net/em8xqtc2/3/),但一定要测试。。。
var一天(单位:毫)=86400000;
函数toDateUTC(str){
var parts=str.split(“-”);
返回日期。UTC(+部分[0],+部分[1]-1,+部分[2]);
}
函数是连续的(a,b){
返回toDateUTC(b)-toDateUTC(a)=一天(单位:毫秒);
}
函数findConceutive(数组){
var结果=[];
无功电流=零;
//循环建立每个结果,每个结果开始一个新条目
//我们找到不连续的一天的时间
array.forEach(函数(条目){
//如果这是第一次通过,或者该条目与
//最后,开始一个新条目
如果(!current | |!是连续的(current.end,entry)){
结果。推送(当前={
开始:进入,
完:进入
});
}否则{
//这是连续的,只需延长最后一个
current.end=条目;
}
});
返回结果;
}
var expectedOutput=FindConceutive(输入);
console.log(预期输出)
。作为控制台包装器{
最大高度:100%!重要;

}
“如何使用递归从序列中提取连续的天数?”虽然您可能可以使用递归进行此操作,但这并不是必需的,而且看起来也不是很有用。你为什么要看递归?因为我根本不知道如何解决这个问题。如果你对非递归解决方案持开放态度,最好编辑这个问题,只询问如何查找连续段,然后提到你的尝试包括递归,但你不需要递归。:-)要查找连续的日期,可以将两个字符串都转换为日期对象,并检查其毫秒的差异。如果差异为86400000,则日期是连续的。@31piy-谢谢。当输入为date only时,它是否可靠地跨DST边界工作?我想应该工作,因为这两个date对象都将在机器的TZ中。需要检查一下。@31piy-我无法说服自己是这样做的。:-)这似乎是:这里有一个DST边界,但我得到了一个整数。如果DST边界有问题,我希望是一个小数。@31piy-根据规范,仅日期表单应解析为UTC,但遗憾的是规范在这方面有所不同(ES2015、ES2016和ES2017在这方面都有变化)。因此,我强制使用UTC并使用毫秒比较。这在DST中应该是可靠的。谢谢