我目前正在学习CoffeeScript,因为它比JavaScript更具“表现力”,因此,我想知道如何优化我在下面的代码
lastDay = 6
weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
weeksToDivide = 0
for x in [1..9001]
if x % 5 == 0
if x % 4 == 0
if x % 3 == 0
nextDay = x
break
totalDays = lastDay + nextDay
day = (totalDays -= 7 while totalDays > 7)
weekday = weekdays[day[day.length - 1] - 1]
alert "Days until next meeting: #{nextDay}"
alert "That day is on a #{weekday}"
我主要是寻找一种优化if nest的方法,但是其他任何提示都会受到赞赏。
提前致谢。
修改
Zeta,我是愚蠢的,忘记了数学是如何工作的。
此外,感谢流行病进一步优化。
答案 0 :(得分:0)
这些优化与CoffeeScript几乎没有关系:
首先,嵌套的if
可以转换为链式and
,例如:
for x in [1..9001]
if x % 5 is 0 and x % 4 is 0 and x % 3 is 0
nextDay = x
break
但是询问数字“x”是否可被5 整除,可被4 整除,而可被3整除,这与询问它是否可被最小公约整除一样这三个数字中的多个,即60.所以循环相当于:
for x in [1..9001]
if x % 60 is 0
nextDay = x
break
但是,该循环总是这样做:将nextDay
分配给60.因此可以将其优化为单个赋值:
nextDay = 60
如果5,4和3除数不是常数,并且你的算法应该能够使用不同的除数,那么你可以将nextDay
设置为这些数的least common multiple。
然后,(totalDays -= 7 while totalDays > 7)
循环创建一个数组,然后只使用其最终元素。逻辑可以用模运算符替换:
totalDays = lastDay + nextDay - 1
weekday = weekdays[totalDays % 7]
答案 1 :(得分:0)
你可以缩短循环(尽管你也可以做nextday = 60
; - ):
for x in [1..9001] when x % 60 is 0
nextDay = x
break