const permutations = arr => {
if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr;
return arr.reduce(
(acc, item, i) =>
acc.concat(
permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [
item,
...val,
])
),
[]
);
};
const permute = (input = [], permutation = []) => {
if (input.length === 0) return [permutation]; // this will be one of the result
// choose each number in a loop
return input.reduce((allPermutations, current) => {
// reduce the input by removing the current element
// as we'll fix it by putting it in `permutation` array
const rest = input.filter(n => n != current);
return [
...allPermutations,
// fixing our choice in the 2nd arg
// by concatenationg current with permutation
...permute(rest, [...permutation, current])
];
}, []);
}