Что вам нужно, это перестановок для всех combinations
так вот код для создания всех комбинаций:
function combination(arr) {
let res= [], len = Math.pow(2, arr.length), c, b, com;
for(c=1;c<len;c++) {
b = c.toString(2).padStart(arr.length, "0").split("");
com = arr.filter((_, idx)=>b[idx]==="1");
res.push(com.join(" "));
}
return res;
}
В действии
function combination(arr) {
let res= [], len = Math.pow(2, arr.length), c, b, com;
for(c=1;c<len;c++) {
b = c.toString(2).padStart(arr.length, "0").split("");
com = arr.filter((_, idx)=>b[idx]==="1");
res.push(com.join(" "));
}
return res;
}
console.log(combination(["a", "b", "c"]));
console.log(combination(["a", "b", "c", "d"]));
Теперь вам нужна перестановка для каждой комбинации. например, для конкретной комбинации a b c
вам нужно найти ["abc", "cba", "acb", ....]
.
Итак, давайте создадим код для перестановки:
Этот код перестановки взят из этого вопроса переполнения стека
function permutation(input) {
var permArr = [],
usedChars = [];
function permute(input) {
var i, ch;
for (i = 0; i < input.length; i++) {
ch = input.splice(i, 1)[0];
usedChars.push(ch);
if (input.length == 0) {
permArr.push(usedChars.slice());
}
permute(input);
input.splice(i, 0, ch);
usedChars.pop();
}
return permArr
}
return permute(input);
}
в действии:
function permutation (input) {
var permArr = [],
usedChars = [];
function permute(input) {
var i, ch;
for (i = 0; i < input.length; i++) {
ch = input.splice(i, 1)[0];
usedChars.push(ch);
if (input.length == 0) {
permArr.push(usedChars.slice());
}
permute(input);
input.splice(i, 0, ch);
usedChars.pop();
}
return permArr
}
return permute(input);
}
console.log(permutation (["a", "b"]));
console.log(permutation (["a", "b", "c"]));
Теперь вам нужно объединить их, чтобы получить желаемое выходное значение для перестановки всей комбинации. И затем мы можем посмотреть последовательность, как только у нас будут все выходные данные, которые мы хотим. Пример сортировки добавлен в этом примере ниже.
function permutation(input) {
var permArr = [],
usedChars = [];
function permute(input) {
var i, ch;
for (i = 0; i < input.length; i++) {
ch = input.splice(i, 1)[0];
usedChars.push(ch);
if (input.length == 0) {
permArr.push(usedChars.slice());
}
permute(input);
input.splice(i, 0, ch);
usedChars.pop();
}
return permArr
}
return permute(input);
}
function allCombos(arr) {
let res= [], len = Math.pow(2, arr.length), c, b, com, per;
for(c=1;c<len;c++) {
b = c.toString(2).padStart(arr.length, "0").split("");
com = arr.filter((_, idx)=>b[idx]==="1");
per = permutation(com).map(e=>e.join(" "));
res.push(...per);
}
return res;
}
var res = allCombos(["a", "b", "c"]);
console.log(res);
//Now, we get all the outputs we want. for the sequence it's seems like its
//an alphabetical sequence, or its a sequencne in order they appears in the input collection.
//Let's just sort alphabetically, if any other sort is required that can be easily done in the final output.
var finalRes = res.sort((a,b)=> a.localeCompare(b));
console.log('Final resule: ', finalRes);