根据月份和年份过滤对象数组

Posted

技术标签:

【中文标题】根据月份和年份过滤对象数组【英文标题】:filter array of objects based on month and year 【发布时间】:2018-11-23 21:07:27 【问题描述】:

我想根据当前月份和年份显示对象

这会根据月份过滤对象,我还需要根据年份过滤对象。

var array = [
    title: "a",
    date: "2018-03-29"
  , 
    title: "b",
    date: "2018-04-13"
  , 
    title: "c",
    date: "2018-04-12"
  , 
    title: "leave",
    date: "2018-04-11"
  , 
    title: "d",
    date: "2018-06-16"
  ],
  currentMonth = new Date().getMonth() + 1,
  events = array.filter(e => 
    var [_, month] = e.date.split('-'); // Or, var month = e.date.split('-')[1];
    return currentMonth === +month;
  );
console.log(events);

【问题讨论】:

使用year而不是_并对照当年检查? @CertainPerformance 谢谢我会 var [year, month] = e.date.split('-'); return currentYear === +year && currentMonth === +month; 【参考方案1】:

要过滤yearmonth,你只需要得到currentYearcurrentMonth,然后得到yearmonth的迭代month

这应该是你的代码:

//Get the currentYear and the currentMonth
currentMonth = new Date().getMonth() + 1,
currentYear = new Date().getFullYear(),

//Get the year and month from the iterated date
var [year, month] = e.date.split('-');

//Then filter the dates
events = array.filter(e => 
    var [year, month] = e.date.split('-'); // Or, var month = e.date.split('-')[1];
    return (currentMonth === +month) && (currentYear == year);
);

演示:

var array = [
    title: "a",
    date: "2018-03-29"
  , 
    title: "b",
    date: "2018-04-13"
  , 
    title: "c",
    date: "2018-04-12"
  , 
    title: "leave",
    date: "2018-04-11"
  , 
    title: "d",
    date: "2018-06-16"
  ],
  currentMonth = new Date().getMonth() + 1,
  currentYear = new Date().getFullYear(),
  events = array.filter(e => 
    var [year, month] = e.date.split('-'); // Or, var month = e.date.split('-')[1];
    return (currentMonth === +month) && (currentYear == year);
  );
console.log(events);

【讨论】:

这已经在 20 分钟前的第一条评论中得到了回答。在过滤器之前也不需要var [year, month] = e.date.split('-'); @mplungjan 是的,它在这条评论中得到了部分回答(我在做出回答之前已经投票赞成),在这里使用破坏非常简单;)是的,我刚刚做了一个完整的答案,包括得到年份和过滤。 :)【参考方案2】:

您可以像2018-06一样创建一个表示年份和月份的字符串,并在date属性中将该值作为子字符串检查,以过滤掉当年和当前月份的记录。

var array = [
    title: "a",
    date: "2018-03-29"
  , 
    title: "b",
    date: "2018-04-13"
  , 
    title: "c",
    date: "2018-04-12"
  , 
    title: "leave",
    date: "2018-06-11"
  , 
    title: "d",
    date: "2018-04-16"
  ,
   
    title: "e",
    date: "2018-06-18"
  ],
  currentMonth = '0'+(new Date().getMonth() + 1),
  currentYear = new Date().getFullYear()
  events = array.filter((e) => 
    var dateStr = currentYear+'-'+currentMonth;
    return (e.date.indexOf(dateStr) !== -1)
  );
console.log(events);

【讨论】:

为什么不只是var [year, month] = e.date.split('-'); return currentYear === +year && currentMonth === +month; @mplungjan 也可以使用解构来完成,但这是我向 OP 展示的其他替代方法。 保持简单。在破坏中添加年份要简单得多 @mplungjan 是的。但是当其他用户访问这个或 OP 本身时,这对于开发逻辑也很有用。 我有一种强烈的感觉,你的解决方案比包括 int 强制转换在内的数字比较重

以上是关于根据月份和年份过滤对象数组的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历数组并显示年份一次,几个月后

根据来自不同对象数组的属性和值过滤对象数组

无法根据另一个对象数组过滤对象数组

根据另一个数组和条件过滤一组对象

如何根据另一个对象数组过滤一个对象数组?

根据字符串数组过滤对象数组