例如,我想要获取从现在到每个星期五的每个星期五的日期,直到现在的30天。
当前,我可以使用下划线库和moment.js来完成此操作。但是结果是超级冗长且令人讨厌的程序/命令。观察:
var initDate = moment().day("Friday");
var endDate = moment().add(30, 'days');
var result = [];
result.push(initDate);
while (_.last(result).isBefore(endDate)) {
var x = _.last(result);
result.push(nextWeek(x));
}
alert(result); // answer here
// create a new moment from given moment and add 7 days
function nextWeek(initMoment) {
var x = moment(initMoment);
return x.add(7,'days');
}
这是相应的小提琴:http://jsfiddle.net/aafsh5xa/
我想知道是否有一种方法可以使用类似于Haskell的功能,例如列表推导或无限列表(懒惰求值)来使其更加简洁。也许像:
var initDate = moment();
var endDate = moment().add(30,days);
var everyFriday = genLazyList(initDate, nextFridayFrom);
var result = _.filter(everyFriday, function(input){ return input.isBefore(endDate); });
请注意,everyFriday是由genLazyList生成的无限列表,并且只有在对其调用_.filter()函数之后才会进行评估。 nextFridayFrom()是genLazyList用于创建惰性列表的函数。
最佳答案
JS是否有儒略日期数据库?这会使事情变得简单得多。
这是一些伪Haskell代码,假定我们具有以下功能:
toJulianDate :: Date -> Int
toDate :: Int -> Date
dayOfWeek :: Date -> Int -- 0 = Sun, 1 = Mon, ... 5 = Fri, etc.
然后我们可以写:
everyFridayBetween :: Date -> Date -> [Date]
everyDridayBetween d1 d2 = map toDate [jfriday, jfriday+7..j2]
where
j1 = toJulianDate d1
j2 = toJulianDate d2
dow = dayOfWeek d1
jfriday = if dow <= 5 then j1+(5-dow) else j1 + 7 + (5-dow)
关于javascript - 每个星期五直到某个日期,但要保持实用的风格?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28792158/