使用Moment.js按“上个月”和“上周”单击时过滤对象数组

filter array of objects on click by 'last month' and 'last week' using moment.js

本文关键字:上个月 过滤 对象 数组 单击 上周 js Moment 使用      更新时间:2023-09-26

我有一个日期创建为 2015-12-11T11:12:14.635Z 来自数组中每个对象的数据库

我想过滤上周和上个月的数组

问题是,如果今天是 19 月 7 日,我要从 11 日到 18 日搜索过去 7 天,这似乎通过计算 7 小时 * 7 来搜索过去 7 天,我的搜索需要从每天 00:00:01 开始。

现在我首先想使用 moment 根据当前日期计算上周.js然后我会将其转换为上述格式,以便我可以过滤数据

基本上,我想根据当前时间戳计算上周。

日期应为:

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

我确实喜欢这个..它对我有用..

_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;
};

然后我使用下划线JS过滤了我的数组。(您也可以使用负载灰)。

_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中使用它。"角度过滤器"

角度过滤器库链接在这里

谢谢你们的支持。

应该让你到达 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');

在这一点之后,数字比较非常方便。

这是我的过滤方式

  1. 今天
  2. 最近 7 天(包括上周)
  3. 最近 30 天(上个月,含)
const today = moment();
const lastSevenDays = moment().subtract(7, 'days');
const lastThirtyDays = moment().subtract(30, 'days');
const FILTER_MAP = {
  All: () => true,
  Today: task => task.timestamp.isBetween(today, today, 'day', '[]'), // [] means inclusive
  Week: task => task.timestamp.isBetween(lastSevenDays, today, 'day', '[]'),
  Month: task => task.timestamp.isBetween(lastThirtyDays, today, 'day', '[]'),
};
const DATA = [
  { id: "0", name: "Eat", timestamp: moment().subtract(6, 'days') },
  { id: "1", name: "Sleep", timestamp: moment() },
  { id: "2", name: "Pawn", timestamp: moment().subtract(28, 'days') },
  { id: "3", name: "Repeat", timestamp: moment().add(1, 'days') } //testing purpose + 1 day
];