Как получить N комбинаций элементов списка JS

Как можно на JS получить все n комбинаций элементов списка list?

Например, дан список list = [1, 2, 3, 4, 5]; и n=4; В итоге должно быть: [[1,2,3,4], [1,3,4,5], [1,2,4,5], [2,3,4,5], [1,2,3,5]]

Число элементов в списке list может быть любым, как и число n. Индекс элементов не важен, то есть не должно быть повторов на подобии: [1,2,3,4] и [2,1,3,4], а также не должны повторяться элементы, например если дан список [1, 2, 3, 4, 5] не должно быть [1, 2, 3, 4] и [1, 1, 3, 4], а вот если бы был дан изначально список [1, 1, 3, 4, 5], то такое такое повторение возможно.


Ответы (2 шт):

Автор решения: nazarpunk

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

function combination(item, n) {
  const filter = typeof n !== 'undefined';
  n = n ? n : item.length;
  const result = [];
  const isArray = item.constructor.name === 'Array';

  const pow = (x, n, m = []) => {
    if (n > 0) {
      for (var i = 0; i < 4; i++) {
        const value = pow(x, n - 1, [...m, isArray ? item[i] : i]);
        result.push(value);
      }
    }
    return m;
  }
  pow(isArray ? item.length : item, n);

  return filter ? result.filter(item => item.length == n) : result;
}

console.log(combination([1, 2, 3, 4, 5], 4));

→ Ссылка
Автор решения: Sergey Glazirin

В данном алгоритме получаем все возможные комбинации элементов в виде массива двоичных чисел, например:

['1', '1', '1', '1', '0'] что соответствует массиву [1, 2, 3, 4]

const array = [1, 2, 3, 4, 5];
const count = 4;

const array2 = [1, 2, 3, 4];
const count2 = 3;

const fromBinaryPosition = (arr) =>
  arr.reduce(
    (acc, item, index) => (item === '1' ? [...acc, array[index]] : acc), []
  );

function getCombinations(array, count) {
  const maxNumber = parseInt(
    ''.padStart(count, '1').padEnd(array.length, '0'),
    2
  );
  const indexedArray = [];
  const minItem = parseInt(''.padStart(count, '1'), 2) - 1;

  for (let i = maxNumber; i >= minItem; i--) {
    const n = i.toString(2);
    if (n.split('1').length - 1 === count) {
      indexedArray.push(n.padStart(array.length, '0').split(''));
    }
  }

  return indexedArray.map(fromBinaryPosition);
}

console.log(getCombinations(array, count));
console.log(getCombinations(array2, count2));

→ Ссылка