Слияние и умножение массивов в один массив - PullRequest
1 голос
/ 27 июня 2019

Мне нужно создать один массив из 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 } ] ```

Ответы [ 3 ]

0 голосов
/ 27 июня 2019

Вы можете использовать карту и квартиру.Это будет более компактно, но это будет очень медленно.Используйте петлю for для лучшей производительности.

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

0 голосов
/ 29 июня 2019

Был запрос некоторое время назад на декартово произведение еще в #852 (январь 2015!).Как видите, он не реализован.

Как говорили другие, выполнение простого цикла без внешних массивов определенно будет быстрее.Чтобы быть уверенным: просто отметьте это.Я подготовил простой набор на 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});
0 голосов
/ 27 июня 2019

Это более функциональное решение, которое использует 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)
...