从嵌套的对象数组创建独特的项目数组

问题描述 投票:0回答:1

我有一个来自课程和会话 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
,返回just
parentCourses
数组,以某种方式展平,然后删除结果数组的重复数据(我可以通过
parentCourses[].id
删除重复数据),但是映射返回嵌套数组的数组总是让我的大脑融化。我也不确定是否有一种聪明的方法可以同时进行重复数据删除……也许是某种
reduce
用法(我的大脑也无法理解)?

javascript arrays multidimensional-array
1个回答
0
投票

您可以使用

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

© www.soinside.com 2019 - 2024. All rights reserved.