Рекурсивно перебирать несколько массивов для объединения значений

Привет спасибо за чтение.

У меня есть несколько входов «меток» (или чипов) с возможностью добавления дополнительных входов тегов. Таким образом, пользователь может получить, скажем, 3 входа, например:

(у них может быть только два входа тегов, но с 4 или 5 тегами каждый, или у них может быть 5 входов тегов только с 1 или 2 тегами)

Мне нужен список, который сопоставляет каждое значение с другим:

  • красный / маленький / мужской
  • красный / большой / мужской
  • зеленый / маленький / мужской
  • зеленый / большой / мужской
  • красный / маленький / мужской
  • красный / маленький / дамы
  • красный / большой / мужской
  • красный / большой / женский
  • зеленый / маленький / мужской
  • зеленый / маленький / женский
  • зеленый / большой / мужской
  • зеленый / большой / женский

На данный момент мой код статичен:

this.optionTypes[0].options.forEach((subOption: string) => {
  this.optionTypes[1].options.forEach((subOption1: string) => {
    this.optionTypes[2].options.forEach((subOption2: string) => {
      this.optionList.push({
        name: subOption + ' / ' + subOption1 + ' / ' + subOption2
      });
    });

  });

}

Но мне нужно иметь возможность рекурсивно перебирать многие входные данные, независимо от того, сколько опций они добавляют или тегов, которые они добавляют в опции.

Спасибо за помощь.

@Yoshi: У вас был интересный ответ на этот вопрос, касающийся генераторов. Я не проверял, но похоже, что это сработает. Зачем удалять ответ?

Scott Sauyet 11.12.2020 18:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
143
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поскольку вы не предоставили воспроизводимый пример своего кода, я предполагаю, что это должно помочь:

this.optionTypes.forEach((subOption: string) => {
    subOption.options.forEach((subOption: string) => {
        // some code
    }
}

Не уверен, что вам нужно использовать рекурсию здесь

Ответ принят как подходящий

То, что вы ищете, называется декартовым произведением массивов. Есть несколько хороших способов их расчета. Вот рекурсивная версия

const cartesian = ([xs, ...xss]) =>
  xs = undefined
    ? []
  : xss.length == 0
    ? xs .map (x => [x])
  : xs .flatMap (x => cartesian (xss) .map (ys => [x, ...ys]))

console .log (
  cartesian ([
    ['red', 'green'],
    ['small', 'large'],
    ['mens', 'ladies'],
  ])
)
.as-console-wrapper {max-height: 100% !important; top: 0}

Но вы также можете написать это с помощью двойного reduce, например:

const cartesian = ([x, ...xs]) => 
  (xs || []) .reduce (
    (a, b) => a .reduce (
      (c, d) => [... c, ... (b .map (e => [... d, e]))],
      []
    ),
    (x || []) .map (x => [x])
  )

Другие вопросы по теме