我在这个结构中有一个动态数组:
$arr = [
['R1', 'R2'],
['A1', 'A2', 'A3'],
['M1', 'M2']
];
我想找到这个数组的所有组合,即:
R1A1M1
R1A1M2
R1A2M1
R1A2M2
R1A3M1
R1A3M2
R2A1M1
R2A1M2
R2A2M1
R2A2M2
R2A3M1
R2A3M2
因为数组长度不是静态的,所以必须使用递归函数来解决这个问题。 这个问题的PHP或js代码是什么?
谢谢
答案 0 :(得分:3)
var result = [""];
$arr.forEach(function(arr){
var tmp = [];
arr.forEach(function(el){
result.forEach(function(curr){
tmp.push(curr+el);
});
});
result = tmp;
});
一些迭代应该这样做......
另一种更静态的方法(可能更快):
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作为示例。
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;
然后,您可以对结果执行任何所需的过滤或排序。
例如,如果您只想要在问题中以特定顺序给出的组合。
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;
有关多种语言的Power Set功能,请参阅:https://rosettacode.org/wiki/Power_set
例如,在ES6中,Power Set可以简单地写为
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;
答案 2 :(得分:0)
tf.Session()
答案 3 :(得分:0)
您可以使用ES6的单线方法
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;
答案 4 :(得分:0)
您可以执行以下操作;
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;