Например, я хочу получить даты каждой пятницы с этого момента до 30 дней.Получение каждой пятницы до определенной даты, но в функциональном стиле?
В настоящее время я могу использовать библиотеку underscore и 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 использует для создания ленивого списка.
может быть, это только мне, но не это должно быть довольно просто -> ** Http: //jsfiddle.net/aafsh5xa/1/** – adeneo
Я спрашиваю конкретно об использовании методов функционального программирования для его выполнения. Ваша скрипка и моя скрипка так же нефункциональны. – adrianmc
Короче говоря, нет никакого способа сделать это в JS, «genLazyList» будет выполняться и оцениваться при вызове и возвращаться каждую пятницу с этого момента до вечности, нет возможности отложить его оценку до тех пор, пока он не пройдет через фильтр. – adeneo