【问题标题】:JavasSript Split an array of objects into multiple arrays with a certain keyJavasCript 将一个对象数组拆分为多个具有某个键的数组
【发布时间】:2020-08-09 08:04:22
【问题描述】:

上下文:我想制作一个检查时间冲突的时间表计划器。非常感谢任何帮助。

具体问题:无法弄清楚如何将我的对象数组拆分为多个数组,并重复某些键。

我的数据集:

let myCourses = [
  {
    course: "ee3001",
    slots: [
      {
        day: "monday",
        time: "0900-1100",
      },
      {
        day: "tuesday",
        time: "0930-1100",
      },
      {
        day: "wednesday",
        time: "1330-1530",
      },
    ],
  },
  {
    course: "ee3002",
    slots: [
      {
        day: "monday",
        time: "0900-1100",
      },
      {
        day: "thursday",
        time: "0930-1130",
      },
    ],
  },
  {
    course: "ee3003",
    slots: [
      {
        day: "tuesday",
        time: "0930-1100",
      },
      {
        day: "wednesday",
        time: "1330-1530",
      },
      {
        day: "thursday",
        time: "0930-1130",
      },
    ],
  },
];

我想将其拆分成的数组:

let newarray = [
  {
    course: "ee3001",
    slot: {
      day: "monday",
      time: "0900-1100",
    },
  },
  {
    course: "ee3001",
    slot: {
      day: "monday",
      time: "1300-1400",
    },
  },
  ...
  ...
];

let newArray2 = //containing info on ee3002
let newArray3 = //containing info on ee3003 

**注意:**要填充数据集,即。用户可以添加更多课程和时间。

  1. 这样做的原因是我可以利用Cartesian Product of arrays 来查找所有组合。
  2. 然后我可以检查给定组合中是否存在任何时间冲突。
  3. 有没有更好的方法来解决这个问题?

【问题讨论】:

标签: javascript arrays javascript-objects data-manipulation timetable


【解决方案1】:

在这里,我使用 map 来遍历您的数组,在该迭代中,我再次使用 map 来遍历插槽。

 let myCourses = [
      {
        course: "ee3001",
        slots: [
          {
            day: "monday",
            time: "0900-1100",
          },
          {
            day: "tuesday",
            time: "0930-1100",
          },
          {
            day: "wednesday",
            time: "1330-1530",
          },
        ],
      },
      {
        course: "ee3002",
        slots: [
          {
            day: "monday",
            time: "0900-1100",
          },
          {
            day: "thursday",
            time: "0930-1130",
          },
        ],
      },
      {
        course: "ee3003",
        slots: [
          {
            day: "tuesday",
            time: "0930-1100",
          },
          {
            day: "wednesday",
            time: "1330-1530",
          },
          {
            day: "thursday",
            time: "0930-1130",
          },
        ],
      },
    ];
    
    const newArray=[]
    myCourses.forEach(myFunction);

    function myFunction(item, index) {
      newArray[index] = [];
      item.slots.map((child) =>
        newArray[index].push({ course: item.course, slots: child })
      );
    }

【讨论】:

  • 我注意到使用 map 进行第一次循环会引发错误“预期在箭头函数中返回值”。因此,使用 forEach 进行第一次循环可能是更好的解决方案。
【解决方案2】:

Ciao,你可以试试这个例子:

let myCourses = [
      {
        course: "ee3001",
        slots: [
          {
            day: "monday",
            time: "0900-1100",
          },
          {
            day: "tuesday",
            time: "0930-1100",
          },
          {
            day: "wednesday",
            time: "1330-1530",
          },
        ],
      },
      {
        course: "ee3002",
        slots: [
          {
            day: "monday",
            time: "0900-1100",
          },
          {
            day: "thursday",
            time: "0930-1130",
          },
        ],
      },
      {
        course: "ee3003",
        slots: [
          {
            day: "tuesday",
            time: "0930-1100",
          },
          {
            day: "wednesday",
            time: "1330-1530",
          },
          {
            day: "thursday",
            time: "0930-1130",
          },
        ],
      },
    ];
    let Arrayee3001 = [];
    let array1 = myCourses.filter(course => course.course === "ee3001")
    array1[0].slots.forEach(slot => {
       let result = {};
       result.course = array1[0].course;
       result.slot = [];
       result.slot.push(slot);
       Arrayee3001.push(result);
    });
    
    console.log(Arrayee3001);

我已经根据course id 过滤了myCourses 数组。然后我在slots 上创建了一个forEach,对于找到的每个插槽,我创建了一个对象result,其中course 从过滤的数组中获取,当前slot。最后,我将这个 result 对象推送到名为 Arrayee3001 的最终数组中。

【讨论】:

  • 不鼓励使用纯代码的答案。请单击edit 并添加一些词来总结您的代码如何解决问题。谢谢
猜你喜欢
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 2023-03-22
  • 2012-08-04
相关资源
最近更新 更多