фильтровать массив объектов по клику по «последнему месяцу» и «последней неделе», используя moment.js

У меня есть dateCreated как 2015-12-11T11:12:14.635Z из базы данных для каждого объекта в массиве

Я хочу отфильтровать этот массив за последнюю неделю и последний месяц

Проблема в том, что если сегодня 19 марта, я должен был искать с 11 по 18 за последние 7 дней, и это, кажется, поиск за последние 7 дней, вычислив 24 часа * 7, мои поиски должны начинаться с 00:00 :01 каждый день.

теперь я сначала хочу рассчитать прошлую неделю сначала.. на основе текущей даты, используя moment.js, а затем я преобразую ее в вышеуказанный формат, чтобы я мог фильтровать данные

По сути, я хочу рассчитать прошлую неделю на основе текущей метки времени.


person Varsha    schedule 27.01.2016    source источник
comment
После того, как вы вычислили первый и последний день недели, используйте дату setHours изменяет время, например, fistDay.setHours(0,0,0); lastDay.setHours(23,59,59); Затем ваш фильтр охватывает весь недельный период. Помните, что часовой пояс может вызвать проблемы. См. также: setUTCHours   -  person Roberto    schedule 27.01.2016
comment
последняя неделя означает предыдущую неделю с понедельника по воскресенье? или последние 7 дней?   -  person Shaishab Roy    schedule 27.01.2016
comment
неясно, что вы ищете: 1- только последняя неделя и дата js месяца; 2-также помощь по фильтрации объекта (это js или фильтр на стороне сервера)   -  person vinjenzo    schedule 27.01.2016


Ответы (3)


даты должны быть:

var last7DayStart = moment().startOf('day').subtract(1,'week');
var lastMonthThisDay = moment().startOf('day').subtract(1,'month');
var yesterdayEndOfRange =  moment().endOf('day').subtract(1,'day');

тогда, если это фильтр javascript, я бы использовал lodash и сделал:

var javascriptArrayOfObjectsWithDates = [
          { date : '2015-12-11T11:12:14.635Z', anotherProperty: 0 },
          { date : moment().subtract(1, 'day' ).format(), testThis: 'works!'}
        ];

var filteredObjects = _.filter(javascriptArrayOfObjectsWithDates,     
                       function(each){ 
                          return moment(each.date)
                            .isBetween(last7DayStart, yesterdayEndOfRange) ;
                       });
person vinjenzo    schedule 27.01.2016

Мне это понравилось .. и это работает для меня ..

_this.lastWeek = function () {
  var result = moment().subtract(7,'days').hours(0);   
  return result._d;
};

_this.lastMonth = function () {
  var result = moment().subtract(30,'days').hours(0);   
  return result._d;
};

затем я отфильтровал свой массив, используя underscoreJS.. (ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ loadash)..

_this.thisWeekData = _.filter(_this.inbox, function(inbox) {
    return (moment(inbox.createdAt) > _this.lastWeek());
});

_this.lastWeekData = _.filter(_this.inbox, function(inbox) {
    return ((moment(inbox.createdAt) < _this.lastWeek()) && (moment(inbox.createdAt) > _this.lastMonth()));
});

_this.lastMonthData = _.filter(_this.inbox, function(inbox) {
    return (moment(inbox.createdAt) < _this.lastMonth());
});

если вы не хотите делать все это в своем контроллере, тогда есть библиотека angular для различных фильтров.. вы можете напрямую использовать ее в html.. "Angular-filter"

ссылка на библиотеку angular-filter находится здесь

Спасибо, ребята, за вашу поддержку..

person Varsha    schedule 28.01.2016
comment
тот же комментарий, что и для другого ответа: .hours(0) оставляет минуты и секунды, поэтому некоторый результат может попасть в них (например, вы могли бы иметь их в lastmontdata, но они относятся к прошлой неделе или они выпадают в lastweekdata, но они 59 минут и 59 секунд на следующий день или 6 дней и 23 часа и 1 секунду назад - person vinjenzo; 28.01.2016
comment
похоже, что вы объединили два ответа в один и адаптировали их к своему коду... правильный процесс - пометить один как правильный, если это так (и можно сделать вывод, что мой выглядит так из вашего собственного... это элементарно ) - person vinjenzo; 28.01.2016

это должно привести вас к моменту времени 7 дней назад в 00:00:00

var time7daysAgo = moment().subtract(7,'days').startOf('day');

var time30daysAgo = moment().subtract(30,'days').startOf('day');

после этого вы просто форматируете все, что вам нравится. Скажите миллисекундную отметку времени unix:

var time7daysAgoMiliseconds = time7daysAgo.format('x');

сравнение чисел очень удобно после этого момента.

person travnik    schedule 27.01.2016
comment
это устанавливает только час на 0, минуты и секунды остаются - person vinjenzo; 27.01.2016