猿问

从具有m个元素的n个数组生成JavaScript组合

从具有m个元素的n个数组生成JavaScript组合

在JavaScript中,我很难想出从n个数组中生成包含m个元素的数组组合的代码。对于其他语言,我也看到过类似的问题,但答案包含了语法或库魔法,我不知道如何翻译。


考虑以下数据:


[[0,1], [0,1,2,3], [0,1,2]]

3数组,其中包含不同数量的元素。我想要做的是通过组合每个数组中的一个项来获得所有的组合。


例如:


0,0,0 // item 0 from array 0, item 0 from array 1, item 0 from array 2

0,0,1

0,0,2

0,1,0

0,1,1

0,1,2

0,2,0

0,2,1

0,2,2

诸若此类。


如果数组的数目是固定的,那么就很容易实现硬编码。但是数组的数量可能有所不同:


[[0,1], [0,1]]

[[0,1,3,4], [0,1], [0], [0,1]]

任何帮助都将不胜感激。


炎炎设计
浏览 659回答 3
3回答

慕慕森

下面是一个使用递归帮助函数的简单而简短的函数:function&nbsp;cartesian()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;r&nbsp;=&nbsp;[],&nbsp;arg&nbsp;=&nbsp;arguments,&nbsp;max&nbsp;=&nbsp;arg.length-1; &nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;helper(arr,&nbsp;i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;j=0,&nbsp;l=arg[i].length;&nbsp;j<l;&nbsp;j++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;a&nbsp;=&nbsp;arr.slice(0);&nbsp;//&nbsp;clone&nbsp;arr &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.push(arg[i][j]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i==max) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.push(a); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helper(a,&nbsp;i+1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;helper([],&nbsp;0); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;r;}用法:cartesian([0,1],&nbsp;[0,1,2,3],&nbsp;[0,1,2]);要使函数接受数组,只需将签名更改为function cartesian(arg)所以arg是一个参数,而不是全arguments.

牧羊人nacy

您可以通过构建子数组来采取迭代的方法。var parts = [[0, 1], [0, 1, 2, 3], [0, 1, 2]],&nbsp; &nbsp; result = parts.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []));console.log(result.map(a => a.join(', ')));.as-console-wrapper { max-height: 100% !important; top: 0; }
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答