[英]javascript recursive function does not work properly
我创建了一个JavaScript递归函数来调整日期:如果日期是星期六或星期天或美国的公共假期,那么该日期将滚动到第二天,直到相关日期不是假期。 我使用“ moment.js”包和相关的“ moment-holiday.js”文件。
代码如下:
<!doctype html>
<script src="moment.js"></script>
<script src="moment-holiday.js"></script>
<script>
function CalcDueDate(dueDate){
var dueDay = moment(dueDate).day();
console.log(dueDay);
if(dueDay == 0 || dueDay == 6 || IsUSHoliday(dueDate) !== undefined ){
dueDate = moment(dueDate).add(1, 'day').format();
console.log('a', dueDate);
CalcDueDate(dueDate);
}
console.log('b', dueDate);
return dueDate;
}
d = "2018-05-19"
var finalDue = CalcDueDate(d);
console.log(finalDue);
</script>
当我运行它时,结果是:
6 moment3.html:12
a 2018-05-20T00:00:00+07:00 moment3.html:9
0 moment3.html:12
a 2018-05-21T00:00:00+07:00 moment3.html:9
1 moment3.html:16
b 2018-05-21T00:00:00+07:00 moment3.html:16
b 2018-05-21T00:00:00+07:00 moment3.html:16
b 2018-05-20T00:00:00+07:00 moment3.html:23
2018-05-20T00:00:00+07:00
第一个“ b”和日期“ 2018-05-21”与预期的一样,但是我不明白为什么第二个和第三个“ b”出现,并将日期带回到“ 2018-05-20”。 有人可以告诉我我的代码在哪里做错了吗? 谢谢。
递归函数通常返回一个值(如边缘情况)或一个递归调用的值。 您目前针对这两种情况都返回一次。 因此,不仅获得了额外的console.logs()
,而且最终返回值错误的5/20/18也就是星期日。 解决方法是确保您返回一个或另一个返回以下内容:
function CalcDueDate(dueDate){
var dueDay = moment(dueDate).day();
console.log(dueDay);
if(dueDay == 0 || dueDay == 6 || IsUSHoliday(dueDate) !== undefined ){
dueDate = moment(dueDate).add(1, 'day').format();
console.log('a', dueDate);
// return the result of recursion.
return CalcDueDate(dueDate);
}
else { // you actually don't need the else -- just here to make it clearer.
// OR return the edge case
console.log('b', dueDate);
return dueDate;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.