【问题标题】:All possible combinations of a 2d array in JavascriptJavascript中二维数组的所有可能组合
【发布时间】:2026-01-17 01:15:02
【问题描述】:

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

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 个小时,但我仍然想不出一种递归方法。这是那些头部爆炸场景之一,因为两个数组的长度都不同(我有一个这些二维数组的数组,我必须得到它的组合)。在我列出的示例中,只有 18 种可能性,但实际上可能有数千种。

【问题讨论】:

标签: javascript arrays


【解决方案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));

【讨论】:

  • 又快又短!非常感谢!
  • 我刚知道这个操作叫做笛卡尔积。
  • Mark Meyer 为我们提供了 5 行解决方案。只是让您知道供您个人使用。
  • 等一下,如果@CapitalJusticeWarrior 说他需要所有可能性,那么除了解决方案之外,您还需要旋转初始数组以获得所有 54 个可能性。让结果 = []; for (让 i=0; i
  • 如果数组中所有元素的索引很重要(例如 [ 'medium', 'blue', 'large' ],[ 'large', 'medium', 'blue' ],[ ' blue', 'medium', 'large' ],),这更值得考虑
【解决方案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))

【讨论】:

  • 上帝之母!只有5行!先生,您今天赢得了互联网!
  • 老实说这么简洁的回答,提醒我其实需要加强递归能力。
最近更新 更多