Todas las formas de dividir una matriz (combinaciones de elementos) en una partición personalizada

Quiero dividir la matriz de n elementos en subconjuntos de tamaño dado con todas las combinaciones posibles de elementos.

Por ejemplo

Array:{1,2,3,4} - puede ser n elementos, 1 <n <100. Puede tener duplicados.

Patrón de tamaño dado (por ejemplo, podría ser diferente):[2 -subarrays, 2-elements]

Resultado Esperado

{1,2}, {3,4}
{1,3}, {2,4}
{1,4}, {2,3}

{2,1}, {3,4}
{1,3}, {4,2}
{3,2}, {1,4}

etc .. Como puede ver, el orden de los elementos en subconjuntos, o el orden de subconjuntos en conjuntos de subconjuntos no importa. Tiene que ser un número mínimo de conjuntos de subconjuntos de matriz de entrada.

Tengo la siguiente solución, pero también incluye permutaciones. Necesito optimizar esto para no generar permutaciones en absoluto. JavaScript no es necesario, cualquier idioma servirá. Gracias de antemano por cualquier ayuda

function getN(n, array, subsets) {
    var f,
        l = array.length,
        indices = [],
        temp;

    array = array.slice();
    while (l--) {
        f = factorial(l);
        indices.push(Math.floor(n / f));
        n %= f;
    }
    temp = indices.map(i => array.splice(i, 1)[0]);
    return subsets
        ? subsets.map((i => l => temp.slice(i, i += l))(0))
        : temp;


}

function factorial(num) {
    var result = 1;
    while (num) {
        result *= num;
        num--;
    }
    return result;
}

var i, l,
    array = ['1', '2', '3', '4'],
    subsets = [2, 2],
    pre = document.getElementById('out');

for (i = 0, l = factorial(array.length); i < l; i++) {
    pre.innerHTML += i.toString().padStart(4) +': ' + JSON.stringify(getN(i, array, subsets)) + '\n';
}
<pre id="out"></pre>

Respuestas a la pregunta(2)

Su respuesta a la pregunta