簡體   English   中英

按日期對對象數組進行分組,並在 Javascript 中的每一天獲取最新的

[英]Group array of objects by date and get newest in each day in Javascript

我正在使用 Express JS 和 Mongo DB 構建 API。 我每天都有一個集合中的條目來存儲各種文檔和數據。 我的查詢使用toArray()以以下格式提取數據

[
  {
    name: 'John',
    events: '600',
    created_at: '2021-01-20T14:56:42.368+00:00' // date object
  },
  {
    name: 'Edward',
    events: '900',
    created_at: '2021-01-20T20:56:42.368+00:00' // date object
  },
  {
    name: 'Jane',
    events: '100',
    created_at: '2021-01-19T13:56:42.368+00:00' // date object
  },
  {
    name: 'Robert',
    events: '700',
    created_at: '2021-01-19T15:56:42.368+00:00' // date object
  }
]

我需要獲取給定日期(分組)的每個 object,然后獲取當天最新的一個,例如:

[
  {
    name: 'Edward',
    events: '900',
    created_at: '2021-01-20T20:56:42.368+00:00' // date object
  },
  {
    name: 'Robert',
    events: '700',
    created_at: '2021-01-19T15:56:42.368+00:00' // date object
  }
]

我寫了一個 function 來試試這個,但它給了我以下類型的格式......

{
  'Tue Jan 19 2021 15:56:42 GMT+0000 (Greenwich Mean Time)': [
    {
      name: 'Robert',
      events: '700',
      created_at: '2021-01-19T15:56:42.368+00:00'
    }
  ]
}

如何修改我的 function 以達到預期的效果。 我哪里錯了?

function groupDataBeyondDaily (data, key = 'created_at') {
  const group = data.reduce((r, a) => {
    r[a.created_at] = [...r[a.created_at] || [], a]
    return r
  }, {})

  return group;
}

您目前正在按created_at屬性中存儲的日期字符串對它們進行分組,但您需要按日期對它們進行分組,然后分別比較一天中的時間。

下面的示例片段從日期字符串創建一個new Date()並計算紀元日期以用作累加器中的鍵。 然后它將先前存儲的日期與當前迭代進行比較,如果較晚則更新它。 最后,它返回由reduce()調用返回的Object.values()的 Object.values()。

 const input = [{ name: 'John', events: '600', created_at: '2021-01-20T14:56:42.368+00:00' }, { name: 'Edward', events: '900', created_at: '2021-01-20T20:56:42.368+00:00' }, { name: 'Jane', events: '100', created_at: '2021-01-19T13:56:42.368+00:00' }, { name: 'Robert', events: '700', created_at: '2021-01-19T15:56:42.368+00:00' }]; function groupDataBeyondDaily(data) { const group = data.reduce((a, o) => { const date = new Date(o['created_at']), day = Math.floor(date / 8.64e7); // 86,400,000ms per day //let entry = (a[day]??= {...o }); using logical nullish assignment let entry = (a[day] = a[day] || {...o }); if (new Date(entry['created_at']) < date) { a[day] = {...o }; } return a }, {}) return Object.values(group); } console.log(groupDataBeyondDaily(input))

暫無
暫無

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

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