/** * @param {*[]} comboOptions * @param {number} comboLength * @return {*[]} */ export default function combineWithoutRepetitions(comboOptions, comboLength) { if (comboLength === 1) { return comboOptions.map(comboOption => [comboOption]); } // Init combinations array. const combos = []; // Eliminate characters one by one and concatenate them to // combinations of smaller lengths. comboOptions.forEach((currentOption, optionIndex) => { const smallerCombos = combineWithoutRepetitions( comboOptions.slice(optionIndex + 1), comboLength - 1, ); smallerCombos.forEach((smallerCombo) => { combos.push([currentOption].concat(smallerCombo)); }); }); return combos; }