Javascript 所有模式组合两个阵列
我在这个结构中有一个动态数组:Javascript 所有模式组合两个阵列,javascript,php,arrays,function,recursion,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中针对这个问题的代码是什么 多谢各位 va
$arr = [
['R1', 'R2'],
['A1', 'A2', 'A3'],
['M1', 'M2']
];
我想找到此阵列的所有组合,即:
R1A1M1
R1A1M2
R1A2M1
R1A2M2
R1A3M1
R1A3M2
R2A1M1
R2A1M2
R2A2M1
R2A2M2
R2A3M1
R2A3M2
因为数组长度不是静态的,所以我们必须使用递归函数来解决这个问题。
PHP或js中针对这个问题的代码是什么
多谢各位
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;
}
要获得数组的所有组合,需要一个函数 在数学中,任何一组的幂集或幂集 附言℘S、 PS,ℙS或2S是S的所有子集的集合, 包括空集和S本身 您可以自己创建这个函数,或者找到预先编写的函数。我将用它作为一个例子 常数arr=[ ['R1','R2'], ['A1','A2','A3'], ['M1','M2'] ]; 常数展平=[…arr[0],…arr[1],…arr[2]; 常数组合=功率设置; const stringCombinations=combinations.mapcombination=>combination.join; console.LogStrings组合; var powerSet=returnExports
您可以在ES6中使用单线方法 变量数组=['R1','R2'],['A1','A2','A3'],['M1','M2'], 结果=array.reducea,b=>a.reducer,v=>r.concatb.mapw=>[]。concatv,w,[]; console.logresult.mapa=>a.join; .作为控制台包装{最大高度:100%!重要;顶部:0;}您可以执行以下操作 var arr=['R1','R2'],['A1','A2','A3'],['M1','M2']; res=arr.reduceRighta,b=>b.reducer,e=>r.concata.mapf=>e+f,[];
console.logres;你自己尝试了什么?你能在JavaScript和PHP之间做出选择吗?或者你想要两种解决方案?我为一个静态数组编写了这段代码:我更喜欢用java脚本编写函数。你需要实现一个函数。这非常好。太棒了。你能用PHP写这段代码吗?不,我不懂PHP:/非常感谢。我用PHP写的:谢谢。你的答案和普雷维乌斯的相似。
var mohem = new Array($arr.reduce((l,a)=>l*a.length,1))
.fill("");
for(var i = 0; i < mohem.length; i++){
var l = mohem.length / $arr[0].length;
for(var j = 0; j < $arr.length; j++){
mohem[i] += $arr[j][Math.floor(i/l)% $arr[j].length ];
if($arr[i+1]) l = l / $arr[i+1].length;
}