簡體   English   中英

從深度嵌套的對象數組中創建過濾和簡化的數據

[英]Creating filtered and simplified data from deeply nested array of objects

根據對嵌套對象屬性值的比較,我有一些復雜的數據集,我需要將其簡化並拆分為兩個不同的集。

這是我正在使用的數據結構:

[
  {
    object: { id: 123 },
    group: [
      {
        events: [
          {
            type: 'type',
            schedule: [
              {
                time: '2019-10-30T09:30:00+00:00',
              },
              {
                time: '2019-10-21T21:00:00+00:00',
              }
            ],
          },
          {
            type: 'type',
            schedule: [
              {
                time: '2019-10-24T09:30:00+00:00',
              },
              {
                time: '2019-09-22T21:00:00+00:00',
              },
            ],
          },
        ],
      },
    ],
  },
]

最重要的事情是將這些數據分成兩個不同的組(對象數組)的基礎上,無論與否的schedule的價值time是在過去還是在未來。 這也將有助於簡化整個結構。 有很多屬性附加到對象上,只要嵌套合乎邏輯且可用,我就可以將整個對象放入其中,而不僅僅是挑選重要的。

因此,對於“過去”數據來說,這樣的事情是理想的:

[
  {
    id: 123,
    events: [
      {
        type: 'type',
        schedule: [
          {
            time: '2019-10-21T21:00:00+00:00',
          }
        ],
      },
      {
        type: 'type',
        schedule: [
          {
            time: '2019-09-22T21:00:00+00:00',
          }
        ],
      }
    ]
  }
]

我一直在嘗試使用不同的數組方法( filtermap )來吐出適合我需要的東西,但不知道如何正確地做到這一點。 主要是如何根據嵌套值進行過濾並復制匹配項上的所有嵌套結構。

嘗試使用map方法和spread運算符:

const result = data.map(({object, group}) => 
    ({ ...object, events: group.map(g=> g.events)}));

 const data = [ { object: { id: 123 }, group: [ { events: [ { type: 'type', schedule: [ { time: '2019-10-30T09:30:00+00:00', }, { time: '2019-10-21T21:00:00+00:00', } ], }, { type: 'type', schedule: [ { time: '2019-10-24T09:30:00+00:00', }, { time: '2019-09-22T21:00:00+00:00', }, ], }, ], }, ], }, ]; const result = data.map(({object, group}) => ({ ...object, events: group.map(g=> g.events)})); console.log(result)

您需要map()來重構數組, 傳播語法以就地迭代對象屬性,並需要filter()根據條件過濾數據。

使用下面的代碼,您可以獲得所有過去事件的數組。 您可以相應地修改條件以獲取所有未來事件。

// mapping from old data array
const pastData = data.map(({object, group}) => ({ 
  // get all properties of the nested "object"
  ...object,

  // map "events" into a new structure
  events: group[0].events.map((event) => (
    {
      // get all other properties
      ...event,

      // include only those "schedule" objects where time is less than current date
      schedule: event.schedule.filter(schedule => new Date(schedule.time) < new Date()),
    }
  )),
}));

這是一個工作示例:

 const data = [ { object: { id: 123 }, group: [ { events: [ { type: 'type', schedule: [ { time: '2019-10-30T09:30:00+00:00', }, { time: '2020-10-21T21:00:00+00:00', } ], }, { type: 'type', schedule: [ { time: '2019-10-24T09:30:00+00:00', }, { time: '2020-09-22T21:00:00+00:00', }, ], }, ], }, ], }, ]; const pastData = data.map(({object, group}) => ({ ...object, events: group[0].events.map((event) => ( { ...event, schedule: event.schedule.filter(schedule => new Date(schedule.time) < new Date()), } )), })); const futureData = data.map(({object, group}) => ({ ...object, events: group[0].events.map((event) => ( { ...event, schedule: event.schedule.filter(schedule => new Date(schedule.time) >= new Date()) } )) })); console.log('past data:', pastData, ', future data:', futureData);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM