@gdima2395
Frontend челик

Как динамически создавать вложенные циклы в JS?

Вопрос заключается в том, как переписать функцию dumbGenerate, чтобы размер массива modifiers мог быть произвольным.

const modifiers = [
  ['A', 'B', 'C'],
  [1, 2, 3],
  ['!', '.']
];

function dumbGenerate(modifiers) {
  const result = [];
  modifiers[0].forEach(letter => {
    modifiers[1].forEach(digit => {
      modifiers[2].forEach(punctuation => {
        result.push([letter, digit, punctuation])
      })
    })
  })
  return result;
}


Результат выполнения:
[ [ 'A', 1, '!' ],
  [ 'A', 1, '.' ],
  [ 'A', 2, '!' ],
  [ 'A', 2, '.' ],
  [ 'A', 3, '!' ],
  [ 'A', 3, '.' ],
  [ 'B', 1, '!' ],
  [ 'B', 1, '.' ],
  [ 'B', 2, '!' ],
  [ 'B', 2, '.' ],
  [ 'B', 3, '!' ],
  [ 'B', 3, '.' ],
  [ 'C', 1, '!' ],
  [ 'C', 1, '.' ],
  [ 'C', 2, '!' ],
  [ 'C', 2, '.' ],
  [ 'C', 3, '!' ],
  [ 'C', 3, '.' ] ]


Как я понимаю, здесь есть 2 варинта решния, генерировать n вложенных циклов или использовать рекурсию. Как генерировать вложенные циклы я вообще не представляю, а с рекурсией я застрял на этом:

function recursiveGenerate(modifiers, startFrom = 0) {
  const lastIndex = modifiers.length - 1;
  if(startFrom > lastIndex) {
    return;
  }; // ????

  for(let value of modifiers[startFrom]) {
    console.log('current value', value)
    recursiveGenerate(modifiers, startFrom + 1);
  }
}

У меня уже получилось выводить в консоль в нужном порядке значения, но я не понимаю как их собрать в массив массивов, как в первом примере.
current value A
current value 1
current value !
current value .
current value 2
current value !
current value .
current value 3
current value !
current value .
current value B
current value 1
current value !
current value .
current value 2
current value !
current value .
current value 3
current value !
current value .
current value C
current value 1
current value !
current value .
current value 2
current value !
current value .
current value 3
current value !
current value .

Заранее спасибо за внимание)
  • Вопрос задан
  • 259 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
function generate(string, rest) {
  if (rest.length == 0) {
    console.log(string);
    return
  }
  rest[0].forEach(element => {
    generate(string+element, rest.slice(1));
  });
}
generate('', modifiers);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы