# How to find all subsets of a set in JavaScript?

Here is one more very elegant solution with no loops or recursion, only using the map and reduce array native functions.

const getAllSubsets =
theArray => theArray.reduce(
(subsets, value) => subsets.concat(
subsets.map(set => [value,...set])
),
[[]]
);

console.log(getAllSubsets([1,2,3]));

We can solve this problem for a subset of the input array, starting from offset. Then we recurse back to get a complete solution.

Using a generator function allows us to iterate through subsets with constant memory usage:

// Generate all array subsets:
function* subsets(array, offset = 0) {
while (offset < array.length) {
let first = array[offset++];
for (let subset of subsets(array, offset)) {
subset.push(first);
yield subset;
}
}
yield [];
}

// Example:
for (let subset of subsets([1, 2, 3])) {
console.log(subset);
}

Runtime complexity is proportional to the number of solutions (2ⁿ) times the average length per solution (n/2) = O(n2ⁿ).

Another simple solution.

function getCombinations(array) {

function fork(i, t) {
if (i === array.length) {
result.push(t);
return;
}
fork(i + 1, t.concat([array[i]]));
fork(i + 1, t);
}

var result = [];
fork(0, []);
return result;
}

var data = [1, 2, 3],
result = getCombinations(data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }