Javascript - 每个订单的单个数组的所有可能组合
Javascript - All Possible Combinations From Single Array Every Order
所以我看到了这个问题,也看到了一些答案,但我想知道是否有可能获得所有组合,即使它在每个可能的顺序中都是重复的。
例如
var array = ["apple", "banana", "lemon", "mango"];
输出
var result = [
"apple"
"apple banana"
"apple banana lemon"
"apple banana lemon mango"
"apple lemon"
"apple lemon banana mango"
"apple lemon mango banana"
"apple mango"
"apple mango lemon banana"
"apple mango banana lemon"
"banana"
"banana apple"
"banana apple lemon"
"banana apple mango"
"banana lemon"
"banana lemon apple"
"banana lemon apple mango"
"banana mango"
...
];
最后,我基本上想要所有可能的组合,无论是 1 件商品还是成对商品,或者每种可能的订单中的多件商品。
我见过最接近的答案就是这组代码。
function getCombinations(valuesArray: String[])
{
var combi = [];
var temp = [];
var slent = Math.pow(2, valuesArray.length);
for (var i = 0; i < slent; i++)
{
temp = [];
for (var j = 0; j < valuesArray.length; j++)
{
if ((i & Math.pow(2, j)))
{
temp.push(valuesArray[j]);
}
}
if (temp.length > 0)
{
combi.push(temp);
}
}
combi.sort((a, b) => a.length - b.length);
console.log(combi.join("\n"));
return combi;
}
let results = getCombinations(['apple', 'banana', 'lemon', ',mango']);
首先创建函数来查找数组的所有组合:
function combinations(array) {
return new Array(1 << array.length).fill().map(
(e1, i) => array.filter((e2, j) => i & 1 << j));
}
然后你必须创建函数来生成给定数组的所有排列(例如 this 使用堆的方法:
function permute(permutation) {
var length = permutation.length,
result = [permutation.slice()],
c = new Array(length).fill(0),
i = 1, k, p;
while (i < length) {
if (c[i] < i) {
k = i % 2 && c[i];
p = permutation[i];
permutation[i] = permutation[k];
permutation[k] = p;
++c[i];
i = 1;
result.push(permutation.slice());
} else {
c[i] = 0;
++i;
}
}
return result;
}
之后,您可以将其组合到最终函数中:
function calculateAllCombinations(myArray) {
var allValues = combinations(myArray)
var response = allValues
for(let v of allValues) {
response = response.concat(permute(v))
}
//Return removed duplicates
return Array.from(new Set(response.map(JSON.stringify)), JSON.parse)
}
最后你可以这样调用它:
var myArray = ["apple", "banana", "lemon", "mango"]
var allValues = calculateAllCombinations(myArray)
所以我看到了这个问题,也看到了一些答案,但我想知道是否有可能获得所有组合,即使它在每个可能的顺序中都是重复的。
例如
var array = ["apple", "banana", "lemon", "mango"];
输出
var result = [
"apple"
"apple banana"
"apple banana lemon"
"apple banana lemon mango"
"apple lemon"
"apple lemon banana mango"
"apple lemon mango banana"
"apple mango"
"apple mango lemon banana"
"apple mango banana lemon"
"banana"
"banana apple"
"banana apple lemon"
"banana apple mango"
"banana lemon"
"banana lemon apple"
"banana lemon apple mango"
"banana mango"
...
];
最后,我基本上想要所有可能的组合,无论是 1 件商品还是成对商品,或者每种可能的订单中的多件商品。
我见过最接近的答案就是这组代码。
function getCombinations(valuesArray: String[])
{
var combi = [];
var temp = [];
var slent = Math.pow(2, valuesArray.length);
for (var i = 0; i < slent; i++)
{
temp = [];
for (var j = 0; j < valuesArray.length; j++)
{
if ((i & Math.pow(2, j)))
{
temp.push(valuesArray[j]);
}
}
if (temp.length > 0)
{
combi.push(temp);
}
}
combi.sort((a, b) => a.length - b.length);
console.log(combi.join("\n"));
return combi;
}
let results = getCombinations(['apple', 'banana', 'lemon', ',mango']);
首先创建函数来查找数组的所有组合:
function combinations(array) {
return new Array(1 << array.length).fill().map(
(e1, i) => array.filter((e2, j) => i & 1 << j));
}
然后你必须创建函数来生成给定数组的所有排列(例如 this 使用堆的方法:
function permute(permutation) {
var length = permutation.length,
result = [permutation.slice()],
c = new Array(length).fill(0),
i = 1, k, p;
while (i < length) {
if (c[i] < i) {
k = i % 2 && c[i];
p = permutation[i];
permutation[i] = permutation[k];
permutation[k] = p;
++c[i];
i = 1;
result.push(permutation.slice());
} else {
c[i] = 0;
++i;
}
}
return result;
}
之后,您可以将其组合到最终函数中:
function calculateAllCombinations(myArray) {
var allValues = combinations(myArray)
var response = allValues
for(let v of allValues) {
response = response.concat(permute(v))
}
//Return removed duplicates
return Array.from(new Set(response.map(JSON.stringify)), JSON.parse)
}
最后你可以这样调用它:
var myArray = ["apple", "banana", "lemon", "mango"]
var allValues = calculateAllCombinations(myArray)