所有模式组合两个数组

时间:2017-08-06 12:29:55

标签: javascript php arrays function recursion

我在这个结构中有一个动态数组:

$arr = [
    ['R1', 'R2'],
    ['A1', 'A2', 'A3'],
    ['M1', 'M2']
];

我想找到这个数组的所有组合,即:

R1A1M1
R1A1M2
R1A2M1
R1A2M2
R1A3M1
R1A3M2
R2A1M1
R2A1M2
R2A2M1
R2A2M2
R2A3M1
R2A3M2

因为数组长度不是静态的,所以必须使用递归函数来解决这个问题。 这个问题的PHP或js代码是什么?

谢谢

5 个答案:

答案 0 :(得分:3)

 var result = [""];
 $arr.forEach(function(arr){
   var tmp = [];
   arr.forEach(function(el){
    result.forEach(function(curr){
     tmp.push(curr+el);
    });
  });
 result = tmp;
});

一些迭代应该这样做......

Result

另一种更静态的方法(可能更快):

var result = new Array($arr.reduce((l,a)=>l*a.length,1))
  .fill("");

for(var i = 0; i < result.length; i++){
  var l = result.length / $arr[0].length;
  for(var j = 0; j < $arr.length; j++){
    result[i] += $arr[j][Math.floor(i/l)% $arr[j].length ];
    if($arr[i+1]) l = l / $arr[i+1].length;
  }

答案 1 :(得分:0)

要获得数组的所有组合,您需要Power Set函数

  

在数学中,写入的任何集合S的幂集(或幂集)   P(S),℘(S),P(S),ℙ(S)或2S,是S的所有子集的集合,   包括空集和S本身。

您可以自己创建,也可以预先找到这样的功能。我将使用https://github.com/Xotic750/power-set-x作为示例。

&#13;
&#13;
const arr = [
  ['R1', 'R2'],
  ['A1', 'A2', 'A3'],
  ['M1', 'M2']
];

const flattened = [...arr[0], ...arr[1], ...arr[2]];
const combinations = powerSet(flattened);
const stringCombinations = combinations.map(combination => combination.join(''));
console.log(stringCombinations);
&#13;
<script src="https://rawgit.com/Xotic750/power-set-x/master/lib/power-set-x.min.js"></script>
<script>
  var powerSet = returnExports
</script>
&#13;
&#13;
&#13;

然后,您可以对结果执行任何所需的过滤或排序。

例如,如果您只想要在问题中以特定顺序给出的组合。

&#13;
&#13;
const arr = [
  ['R1', 'R2'],
  ['A1', 'A2', 'A3'],
  ['M1', 'M2']
];

const flattened = [...arr[0], ...arr[1], ...arr[2]];
const combinations = powerSet(flattened);
const stringCombinations = combinations.map(combination => combination.join(''));
const filtered = stringCombinations.filter(string => /^R\dA\dM\d$/.test(string)).sort();
console.log(filtered);
&#13;
<script src="https://rawgit.com/Xotic750/power-set-x/master/lib/power-set-x.min.js"></script>
<script>
  var powerSet = returnExports
</script>
&#13;
&#13;
&#13;

有关多种语言的Power Set功能,请参阅:https://rosettacode.org/wiki/Power_set

例如,在ES6中,Power Set可以简单地写为

&#13;
&#13;
const arr = [
  ['R1', 'R2'],
  ['A1', 'A2', 'A3'],
  ['M1', 'M2']
];

const flattened = [...arr[0], ...arr[1], ...arr[2]];
const powerSet = xs => xs.reduceRight((a, x) => a.concat(a.map(y => [x].concat(y))), [[]]);
const combinations = powerSet(flattened);
console.log(combinations);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

tf.Session()

答案 3 :(得分:0)

您可以使用ES6的单线方法

&#13;
&#13;
var array = [['R1', 'R2'], ['A1', 'A2', 'A3'], ['M1', 'M2']],
    result = array.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []));

console.log(result.map(a => a.join('')));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 4 :(得分:0)

您可以执行以下操作;

&#13;
&#13;
var arr = [ ['R1', 'R2'], ['A1', 'A2', 'A3'], ['M1', 'M2']];
    res = arr.reduceRight((a,b) => b.reduce((r,e) => r.concat(a.map(f => e + f)), []));
console.log(res);
&#13;
&#13;
&#13;