例如,我想要获取从现在到每个星期五的每个星期五的日期,直到现在的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/

10-12 15:50