javascript - 每个星期五直到某个日期,但以实用的方式?

标签 javascript haskell functional-programming underscore.js lazy-evaluation

例如,我想获取从现在到 30 天后每个星期五的日期。

目前,我可以使用 underscore 库和 moment.js 来做到这一点。但结果是 super 冗长和令人烦恼的程序/命令。观察:

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');    
}

这是相应的 fiddle :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 有 Julian 日期库吗?这将使事情变得简单得多。

这里是一些伪 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/

相关文章:

scala - Scalaz 中 *> 和 <* 的用途是什么

javascript - 如何在Elm中实现Vue的transition group功能?

javascript - 将 prop 动态添加到 React 组件数组中的最后一个元素

windows - Windows 上 Haskell 中的 Unicode 控制台 I/O

haskell - 为什么我的 IO 没有按顺序执行?

javascript - 如何计算一个值在没有突变的情况下在数组中出现的次数

javascript - 我的 map v3 只是拒绝加载

javascript - 更改输入标记

unit-testing - Haskell Test.Framework 指定从命令行运行的测试数量

ruby - 在功能上找到通过测试的第一个值的映射