Javascript - 每个订单来自单个数组的所有可能组合

问题描述 投票:0回答:1

Javascript - 生成单个数组中元素的所有组合(成对)

所以我已经看到了这个问题,也看到了一些答案,但我想知道是否有可能获得所有组合,即使它在每个可能的顺序中都是重复的。

例如。

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']);

javascript arrays algorithm combinations
1个回答
4
投票

首先创建函数来查找数组的所有组合:

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)

function combinations(array) {
  return new Array(1 << array.length).fill().map(
    (e1, i) => array.filter((e2, j) => i & 1 << j));
}

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)

console.log(allValues);
.as-console-wrapper{top:0;max-height:unset!important;overflow:auto!important;}

© www.soinside.com 2019 - 2024. All rights reserved.