我有一个来自课程和会话 CMS 的数据对象。课程是课程的子项目,即课程由一系列课程组成。课程已过时,但课程未过时。
我正在使用 GraphQL 获取所有会话(并按日期过滤,只获取特定日期范围内的会话,以免浪费并获取一堆过期的东西)。我可以在该查询中获取会话的父课程数据。
查询返回一个对象数组,最终看起来像这样:
sessions: [
{
id: "session1",
startDatetime: "2023-02-01T13:30:00.000Z",
endDatetime: "2023-02-01T17:30:00.000Z",
// etc.
parentCourses: [
{
id: "course1",
title: "Course 1",
clientName: "Example client",
// etc.
},
],
},
{
id: "session2",
startDatetime: "2023-02-02T13:30:00.000Z",
endDatetime: "2023-02-02T17:30:00.000Z",
// etc.
parentCourses: [
{
id: "course1",
title: "Course 1",
clientName: "Example client",
// etc.
},
],
},
{
id: "session3",
startDatetime: "2023-02-03T13:30:00.000Z",
endDatetime: "2023-02-03T17:30:00.000Z",
// etc.
parentCourses: [
{
id: "course2",
title: "Course 2",
clientName: "A different client",
// etc.
},
],
},
// etc.
];
当然,根数组中有很多会话,会话可以有相同的父课程。会话通常只有一个父课程,但一个会话作为多个课程的一部分并不是完全不可能的(因此为什么
parentCourses
是一个数组)。
我想做的是映射数组并从
parentCourses
对象中得到一个唯一的课程对象列表。
我想我需要在主数组上
map
,返回justparentCourses
数组,以某种方式展平,然后删除结果数组的重复数据(我可以通过parentCourses[].id
删除重复数据),但是映射返回嵌套数组的数组总是让我的大脑融化。我也不确定是否有一种聪明的方法可以同时进行重复数据删除……也许是某种reduce
用法(我的大脑也无法理解)?
您可以使用
Array#flatMap
,使用 Array#filter
和 Set
来处理删除重复项。
let sessions=[{id:"session1",startDatetime:"2023-02-01T13:30:00.000Z",endDatetime:"2023-02-01T17:30:00.000Z",parentCourses:[{id:"course1",title:"Course 1",clientName:"Example client"},]},{id:"session2",startDatetime:"2023-02-02T13:30:00.000Z",endDatetime:"2023-02-02T17:30:00.000Z",parentCourses:[{id:"course1",title:"Course 1"},]},{id:"session3",startDatetime:"2023-02-03T13:30:00.000Z",endDatetime:"2023-02-03T17:30:00.000Z",parentCourses:[{id:"course2",title:"Course 2"},]}];
let s = new Set,
res = sessions.flatMap(x => x.parentCourses.filter(({id}) => !s.has(id) && s.add(id)));
console.log(res);