我有一系列與事件相關的物件。事件按鍵/值組織,其中鍵是月初的日期時間,值是該月內具有特定日期時間的陣列或物件。
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 日
這應該過濾掉十月物件以及在給定日期范圍內的任何事件,同時保留父物件。所以結果將是:
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。
uj5u.com熱心網友回復:
這看起來有點笨拙,但它非常簡單。首先,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"));
uj5u.com熱心網友回復:
一方面,
const min = dateRange[0].getTime();
const max = dateRange[1].getTime();
需要是:
const min = new Date(dateRange[0]).getTime();
const max = new Date(dateRange[1]).getTime();
然后,在初始回圈之后,我會做一個映射以從value. 邏輯與您已有的過濾器非常相似。
uj5u.com熱心網友回復:
每個事件的值都有完整的日期。使用它們排除范圍之外的日期,然后排除任何沒有值的事件。
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 );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/376516.html
標籤:javascript 数组 目的
