JavaScript中二维数组的所有可能组合

时间:2018-11-15 03:03:38

标签: javascript arrays

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

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的组合。我已经研究了将近2个小时,但仍然想不出一种递归的方法。这是那些爆炸的场景之一,因为这两个数组的长度都不同(我有这些2d数组的数组,我必须获得这些数组的组合)。在我列出的示例中,只有18种可能性,但实际上可能有成千上万种。

2 个答案:

答案 0 :(得分:2)

使用递归函数时的另一种选择是在函数的参数中保持状态。 有时可以使该功能更易于理解:

var arr2d = [['red', 'blue'],['cotton','polyester','silk'],['large','medium','small']]

function combos(list, n = 0, result = [], current = []){
    if (n === list.length) result.push(current)
    else list[n].forEach(item => combos(list, n+1, result, [...current, item]))
 
    return result
}

console.log(combos(arr2d))

答案 1 :(得分:1)

这是一个递归解决方案。想法是采用第一个元素数组,在其余元素数组上递归找到组合,然后组合结果:

const arr2d = [
  ['red', 'blue'],
  ['cotton', 'polyester', 'silk'],
  ['large', 'medium', 'small']
];

function combinations(arr) {
  if (arr.length === 0) return [[]];
  let res = [], [first, ...rest] = arr;
  let remaining = combinations(rest);
  first.forEach(e => {
    remaining.forEach(smaller => {
      res.push([e].concat(smaller));
    });
  });
  return res;
}

console.log(combinations(arr2d));