简体   繁体   English

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

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

I have an array of Objects relating to events.我有一组与事件相关的对象。 The events are organised by key/value where the Key is a DateTime of the beginning of the month, and the value is an Array or objects which have a specific DateTime within that month.事件按键/值组织,其中键是月初的日期时间,值是在该月内具有特定日期时间的数组或对象。

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" },
        ],
    },
];

I need to filter these events by a given date range, eg Nov 15 2021 - Dec 04 2021我需要按给定的日期范围过滤这些事件,例如 2021 年 11 月 15 日 - 2021 年 12 月 4 日

This should filter out the October object and also any events which fall within the given date Range while keeping the parent object.这应该过滤掉十月 object 以及在给定日期范围内的任何事件,同时保留父 object。 So the result would be:所以结果是:

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" },
        ],
    },
];

So far, I've got the filtering done at the month level as below, but can't figure out how to handle the day level.到目前为止,我已经在月级别完成了如下过滤,但无法弄清楚如何处理日级别。

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

Ideally would like to just use ES6, but can use lodash.理想情况下只想使用 ES6,但可以使用 lodash。

for one thing,一方面,

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

needs to be:需要是:

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

Then, after the initial loop, I would do a map in order to remove elements from value .然后,在初始循环之后,我会执行 map 以从value中删除元素。 The logic would be very similar to the filter you already have.逻辑将与您已有的过滤器非常相似。

This looks a little unwieldy but it's pretty simple.这看起来有点笨拙,但很简单。 First, map your array and filter out any value.date that do not fit in the range.首先, map您的数组并过滤掉任何不适合该范围的value.date Then simply filter out any parent elements that have a zero-length value array.然后简单地过滤掉任何具有零长度值数组的父元素。

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

The values for each event have a full date.每个事件的值都有一个完整的日期。 Use them to exclude dates outside the range, then exclude any events with no values.使用它们排除范围之外的日期,然后排除任何没有值的事件。

 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.

相关问题 Javascript 或 lodash:过滤具有嵌套数组值的对象数组 - Javascript or lodash : filter an array of objects with value of a nested array 过滤 Javascript 数组以检查所有嵌套对象中的特定值 - Filter a Javascript array to check specific value in all nested objects Javascript:过滤掉一个对象数组并根据键而不是值进行选择 - Javascript: Filter out on an array of objects and pick based on key, not value JavaScript,按特定键的值过滤对象数组 - JavaScript, filter array of objects by a specific key's value 如何在 JavaScript 中将嵌套对象数组转换为具有键值对的对象 - How to convert an array of nested objects to an object with key, value pairs in JavaScript 如何在 javascript 中以键值对格式制作嵌套数组对象 - how to make nested array objects in javascript in a key value pair format 如何更新 Javascript 中嵌套对象数组中的键/值对 - How to update a key/value pair in a nested array of objects in Javascript typescript 或 JavaScript 将嵌套的对象数组转换为键值对 - typescript or JavaScript convert nested array of objects to key,value pair 根据对象键过滤对象数组 JavaScript - Filter JavaScript Array of Objects based on Objects Key 按 javascript 中的值过滤对象数组 - filter array of objects by value in javascript
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM