[英]How to combine like objects within array of objects and insert new object?
I have an array of objects for a podcast app that looks like this:我有一个播客应用程序的对象数组,如下所示:
[{ id: "uuid-1"
timeInSeconds: 1000
dateListened: "2021-01-01T15:57:17.000Z" }, // <---same day
{ id: "uuid-2"
timeInSeconds: 4900
dateListened: "2021-01-01T16:57:17.000Z" }, // <---same day
{ id: "uuid-3"
timeInSeconds: 3200
dateListened: "2021-09-01T16:57:17.000Z" },
{ id: "uuid-4"
timeInSeconds: 6000
dateListened: "2021-10-01T16:57:17.000Z" } ]
I want to create a function that combines activity times if the dateListened
is on the same day.如果dateListened
在同一天,我想创建一个结合活动时间的 function。 I want it to look something like this:我希望它看起来像这样:
[{ id: "uuid-new"
timeInSeconds: 5900 // <---- combined seconds listened on Jan 1
dateListened: "2021-01-01T15:57:17.000Z" },
{ id: "uuid-3"
timeInSeconds: 3200
dateListened: "2021-09-01T16:57:17.000Z" },
{ id: "uuid-4"
timeInSeconds: 6000
dateListened: "2021-10-01T16:57:17.000Z" } ]
My closest attempts have been to use a.map() with a nested.some() but I'm still far off enough that it's not even worth posting my tries.我最接近的尝试是将 a.map() 与 nested.some() 一起使用,但我仍然远远不够,甚至不值得发布我的尝试。 Does anyone have any hints or ideas of what direction to try next?有没有人对下一步尝试什么方向有任何提示或想法? Thank you!谢谢!
You could reduce the items and map them to a date key, retrieve the values, and then map them to single objects.您可以将项目和 map 减少为日期键,检索值,然后将 map 减少为单个对象。
You can key on the following:您可以键入以下内容:
let date = new Date(info.dateListened).toLocaleDateString('en-US')
const data = [ { id: "uuid-1", timeInSeconds: 1000, dateListened: "2021-01-01T15:57:17.000Z" }, // <---same day { id: "uuid-2", timeInSeconds: 4900, dateListened: "2021-01-01T16:57:17.000Z" }, // <---same day { id: "uuid-3", timeInSeconds: 3200, dateListened: "2021-09-01T16:57:17.000Z" }, { id: "uuid-4", timeInSeconds: 6000, dateListened: "2021-10-01T16:57:17.000Z" } ]; const result = Object.values(data.reduce((acc, info) => (date => ({...acc, [date]: [...(acc[date] || []), info ] })) (new Date(info.dateListened).toLocaleDateString('en-US')), {})).map(value => value.length === 1? value: { id: 'uuid-new', timeInSeconds: value.reduce((sum, { timeInSeconds }) => sum + timeInSeconds, 0), dateListened: value[0].dateListened }); console.log(result);
.as-console-wrapper { top: 0; max-height: 100%;important; }
You can achieve the result using reduce and only add the timeInSeconds
if its year
, month
, and date
is exactly the same/equal.您可以使用reduce获得结果,并且仅在其year
、 month
和date
完全相同/相等时才添加timeInSeconds
。
const arr = [ { id: "uuid-1", timeInSeconds: 1000, dateListened: "2021-01-01T15:57:17.000Z", }, { id: "uuid-2", timeInSeconds: 4900, dateListened: "2021-01-01T16:57:17.000Z", }, { id: "uuid-3", timeInSeconds: 3200, dateListened: "2021-09-01T16:57:17.000Z", }, { id: "uuid-4", timeInSeconds: 6000, dateListened: "2021-10-01T16:57:17.000Z", }, ]; const result = arr.reduce((acc, curr) => { const { id, timeInSeconds, dateListened } = curr; const searchSameDateElement = acc.find((o) => { const first = new Date(o.dateListened); const second = new Date(dateListened); const isYearSame = first.getFullYear() === second.getFullYear(); const isMonthSame = first.getMonth() === second.getMonth(); const isDateSame = first.getDate() === second.getDate(); return isYearSame && isMonthSame && isDateSame; }); if (.searchSameDateElement) { acc;push(curr). } else { searchSameDateElement;timeInSeconds += timeInSeconds; } return acc, }; []). console;log(result);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.