将数组合并并乘以一个数组

Merge and multiply arrays into one single array

我需要从 3 个数组创建一个数组,

我已经实现了逻辑并且它正在工作,但我认为 Array.prototype 我可以以更好的性能实现同样的效果

let classrooms = [
    1,
    2
]
let modules = [
    5,
    6
]

let weeks = [
   7,
   8
]

let avalArray = [];
classrooms.forEach(classroomId => {
        modules.forEach(moduleId => {
            weeks.forEach(week => {
                avalArray.push({
                    classroomId: classroomId,
                    moduleId: moduleId,
                    week: week
                });
            });
        });
    }); 

这是预期的输出:

[ { classroomId: 1, moduleId: 5, week: 7 },
  { classroomId: 1, moduleId: 5, week: 8 },
  { classroomId: 1, moduleId: 6, week: 7 },
  { classroomId: 1, moduleId: 6, week: 8 },
  { classroomId: 2, moduleId: 5, week: 7 },
  { classroomId: 2, moduleId: 5, week: 8 },
  { classroomId: 2, moduleId: 6, week: 7 },
  { classroomId: 2, moduleId: 6, week: 8 } ] ```

这是一个更实用的解决方案,它使用 Array.flatMap()Array.map() 来生成对象数组。

但是,我认为你的性能应该更好,因为你的不会生成时态数组,然后将其展平为其他时态数组,这些时态数组展平为单个数组。

const classrooms = [1, 2]
const modules = [5, 6]
const weeks = [7, 8]

const result = classrooms.flatMap(classroomId =>
  modules.flatMap(moduleId =>
    weeks.map(week => ({
      classroomId,
      moduleId,
      week
    }))))
    
console.log(result)

您可以使用地图和公寓。它会更紧凑,但会很慢。使用 for 循环以获得更好的性能。

classrooms .map(classroomId => modules .map(moduleId => weeks.map(week => ({classroomId, moduleId, week}))) ).flat(2)

前段时间 #852(2015 年 1 月!)有一个笛卡尔积的请求。如您所见,它没有实现。

正如其他人所说,在没有外部数组的情况下执行简单循环肯定会更快。可以肯定的是:只是对其进行基准测试。我在 perf.link 上准备了一个简单的套件,结果如下:

for-loop:         175us
for-of-loop:      175us
forEach:          290us
map-map-map-flat: 465us
flatMap:          5635us

确切的数字在这里并不重要,但这里有一个要点:for-of 循环(未转译!)是最快且仍然非常优雅的循环之一:

const result = [];
for (const classroomId of classrooms)
  for (const moduleId of modules)
    for (const week of weeks)
      result.push({classroomId, moduleId, week});