Javascript中2d数组的所有可能组合

Javascript中2d数组的所有可能组合,javascript,arrays,Javascript,Arrays,所以我有一个可变长度数组,里面填充了可变长度数组。比如说: var arr2d = [ ['red', 'blue'], ['cotton','polyester','silk'], ['large','medium','small'] ] 我试图从每个数组中获取所有可能的组合。所以答案应该是这样的: var answer = [ ['red', 'cotton', 'large'], ['red', 'cotton', 'medium'], [

所以我有一个可变长度数组,里面填充了可变长度数组。比如说:

var arr2d = [
    ['red', 'blue'],
    ['cotton','polyester','silk'],
    ['large','medium','small']
]
我试图从每个数组中获取所有可能的组合。所以答案应该是这样的:

var answer = [
    ['red', 'cotton', 'large'],
    ['red', 'cotton', 'medium'],
    ['red', 'cotton', 'small'],
    ['red', 'polyester', 'large'],
    .
    .
    .
]

我已经研究了关于这个主题的另一个答案,但是所有答案都是用java(我需要javascript)编写的,他们在寻找所有的组合,而不仅仅是
length===arr2d.length
的组合。我已经看了差不多两个小时了,但我仍然想不出一个递归的方法。这是一种头部爆炸的场景,因为两个阵列的长度不同(我有一个2d阵列,我必须得到它们的组合)。在我列出的示例中,只有18种可能性,但实际上可能有数千种。

这里是一个递归解决方案。其思想是获取第一个元素数组,递归地在剩余的元素数组上找到组合,然后组合结果:

const arr2d=[
[‘红色’、‘蓝色’],
[‘棉’、‘聚酯’、‘丝’],
[‘大’、‘中’、‘小’]
];
功能组合(arr){
if(arr.length==0)返回[];
设res=[],[first,…rest]=arr;
让剩余=组合(剩余);
first.forEach(e=>{
剩余。forEach(较小=>{
力推([e].concat(较小));
});
});
返回res;
}

控制台日志(组合(arr2d))使用递归函数时的另一个选项是维护函数参数中的状态。这有时会使函数更容易理解:

var arr2d=[['红色'、'蓝色']、['棉'、'涤纶'、'丝']、['大'、'中'、'小']]
函数组合(列表,n=0,结果=[],当前=[]){
如果(n==list.length)result.push(当前)
else列表[n].forEach(项=>组合(列表,n+1,结果,[…当前,项])
返回结果
}

console.log(combos(arr2d))
速度快而且很短!非常感谢你!我刚刚了解到这个操作叫做笛卡尔积。马克·迈耶给了我们一个5行的解决方案。只是让你知道自己的个人用途。等等,如果@CapitalJusticeWarrior说他需要所有的可能性,那么在解决方案之上,你需要重新测试初始数组以获得所有54个可能性。让结果=[];for(设i=0;i和if数组中所有元素的索引都很重要(例如['medium'、'blue'、'large']、['large'、'medium'、'blue']、['blue'、'medium'、'large'],),这更让我想起上帝了!只有5行!先生,你今天赢得了互联网!如此简洁的回答提醒了我,实际上我需要加强我的递归能力。可能是