繁体   English   中英

按 JavaScript 中的键和嵌套值过滤对象数组

[英]Filter an array of objects by key and nested value in JavaScript

我有一组与事件相关的对象。 事件按键/值组织,其中键是月初的日期时间,值是在该月内具有特定日期时间的数组或对象。

allEvents = [
    {
        key: "Dec 2021",
        value: [
            { id: 0, date: "Dec 06 2021" },
            { id: 1, date: "Dec 01 2021" },
        ],
    },
    {
        key: "Nov 2021",
        value: [
            { id: 0, date: "Nov 27 2021" },
            { id: 1, date: "Nov 23 2021" },
            { id: 2, date: "Nov 10 2021" },
        ],
    },
    {
        key: "Oct 2021",
        value: [
            { id: 0, date: "Oct 27 2021" },
            { id: 1, date: "Oct 23 2021" },
            { id: 2, date: "Oct 10 2021" },
        ],
    },
];

我需要按给定的日期范围过滤这些事件,例如 2021 年 11 月 15 日 - 2021 年 12 月 4 日

这应该过滤掉十月 object 以及在给定日期范围内的任何事件,同时保留父 object。 所以结果是:

filteredEvents = [
    {
        key: "Dec 2021",
        value: [
            { id: 1, date: "Dec 01 2021" },
        ],
    },
    {
        key: "Nov 2021",
        value: [
            { id: 0, date: "Nov 27 2021" },
            { id: 1, date: "Nov 23 2021" },
        ],
    },
];

到目前为止,我已经在月级别完成了如下过滤,但无法弄清楚如何处理日级别。

const dateRange = ["Nov 15 2021", "Dec 04 2021"];
const min = dateRange[0].getTime();
const max = dateRange[1].getTime();

const filteredEvents = allEvents.filter(
  eventGroup => new Date(eventGroup.key).getTime() >= min && new Date(eventGroup.key).getTime() <= max);

理想情况下只想使用 ES6,但可以使用 lodash。

一方面,

const min = dateRange[0].getTime();
const max = dateRange[1].getTime();

需要是:

const min = new Date(dateRange[0]).getTime();
const max = new Date(dateRange[1]).getTime();

然后,在初始循环之后,我会执行 map 以从value中删除元素。 逻辑将与您已有的过滤器非常相似。

这看起来有点笨拙,但很简单。 首先, map您的数组并过滤掉任何不适合该范围的value.date 然后简单地过滤掉任何具有零长度值数组的父元素。

const filteredEvents = (from, to) => allEvents
  .map( g => 
     ({...g, 
       value: g.value.filter(f => 
         new Date(f.date).getTime() >= new Date(from).getTime() && 
         new Date(f.date).getTime() <= new Date(to).getTime())
      }))
  .filter(f => f.value.length>0);

 let allEvents = [{ key: "Dec 2021", value: [{ id: 0, date: "Dec 06 2021" }, { id: 1, date: "Dec 01 2021" }, ], }, { key: "Nov 2021", value: [{ id: 0, date: "Nov 27 2021" }, { id: 1, date: "Nov 23 2021" }, { id: 2, date: "Nov 10 2021" }, ], }, { key: "Oct 2021", value: [{ id: 0, date: "Oct 27 2021" }, { id: 1, date: "Oct 23 2021" }, { id: 2, date: "Oct 10 2021" }, ], }, ]; const filteredEvents = (from, to) => allEvents.map( g => ({...g, value: g.value.filter(f => new Date(f.date).getTime() >= new Date(from).getTime() && new Date(f.date).getTime() <= new Date(to).getTime())})).filter(f => f.value.length>0); console.log(filteredEvents("Nov 15 2021", "Dec 04 2021"));

每个事件的值都有一个完整的日期。 使用它们排除范围之外的日期,然后排除任何没有值的事件。

 const allEvents = [ { key: "Dec 2021", value: [ { id: 0, date: "Dec 06 2021" }, { id: 1, date: "Dec 01 2021" }, ], }, { key: "Nov 2021", value: [ { id: 0, date: "Nov 27 2021" }, { id: 1, date: "Nov 23 2021" }, { id: 2, date: "Nov 10 2021" }, ], }, { key: "Oct 2021", value: [ { id: 0, date: "Oct 27 2021" }, { id: 1, date: "Oct 23 2021" }, { id: 2, date: "Oct 10 2021" }, ], }, ]; const dateRange = ["Nov 15 2021", "Dec 04 2021"]; const [min, max] = dateRange.map(d => new Date(d).getTime()); const filteredEvents = allEvents.map(({key,value}) => ({ key, value:value.filter(({date:d}) => new Date(d).getTime() >= min && new Date(d).getTime() <= max) })).filter(({value:v}) => v.length); console.log( filteredEvents );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM