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中应该是可靠的。谢谢