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

10 javascript arrays

所以我有一个用可变长度数组填充的可变长度数组。例如这样的事情:

var arr2d = [
    ['red', 'blue'],
    ['cotton','polyester','silk'],
    ['large','medium','small']
]
Run Code Online (Sandbox Code Playgroud)

我试图从每个数组中获取一个的所有可能组合。所以答案应该是这样的:

var answer = [
    ['red', 'cotton', 'large'],
    ['red', 'cotton', 'medium'],
    ['red', 'cotton', 'small'],
    ['red', 'polyester', 'large'],
    .
    .
    .
]
Run Code Online (Sandbox Code Playgroud)

我已经查看了有关此主题的其他答案,但所有答案都在 Java 中(我需要 javascript)并且他们正在寻找所有组合,而不仅限于length === arr2d.length. 我已经看了将近 2 个小时,但仍然想不出递归地执行此操作的方法。这是头部爆炸场景之一,因为两个数组的长度都不同(我有一个这些二维数组的数组,我必须获得组合)。在我列出的示例中,只有 18 种可能性,但实际上可能有数千种。

Mar*_*yer 15

使用递归函数时的另一个选择是在函数的参数中维护您的状态。这有时可以使函数更容易理解:

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))
Run Code Online (Sandbox Code Playgroud)

  • 圣母玛利亚!只有 5 行!先生,您今天赢得了互联网! (2认同)

sli*_*der 5

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

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));
Run Code Online (Sandbox Code Playgroud)