繁体   English   中英

如何在对象数组中组合类似的对象并插入新的 object?

[英]How to combine like objects within array of objects and insert new object?

我有一个播客应用程序的对象数组,如下所示:

[{ 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" } ]

如果dateListened在同一天,我想创建一个结合活动时间的 function。 我希望它看起来像这样:

[{ 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" } ]

我最接近的尝试是将 a.map() 与 nested.some() 一起使用,但我仍然远远不够,甚至不值得发布我的尝试。 有没有人对下一步尝试什么方向有任何提示或想法? 谢谢!

您可以将项目和 map 减少为日期键,检索值,然后将 map 减少为单个对象。

您可以键入以下内容:

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

您可以使用reduce获得结果,并且仅在其yearmonthdate完全相同/相等时才添加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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM