Как получить 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 шт):
На 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));
В данном алгоритме получаем все возможные комбинации элементов в виде массива двоичных чисел, например:
['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));