如何在对象数组中组合相似的对象并插入新对象



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

[{ 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在同一天,我想创建一个组合活动时间的函数。我希望它看起来像这样:

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

我最接近的尝试是使用带有嵌套.some((的.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; }

如果yearmonthdate完全相同/相等,则可以使用reduce并仅添加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);

最新更新