You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中从动态矩阵生成笛卡尔积形式的列表?

嗨,你需要的其实是计算数组的笛卡尔积——也就是把多个数组的所有元素组合全部列出来,不管输入数组后续添加多少个子项,这两种方案都能完美适配:

方案一:递归实现

递归的思路是把问题拆解成更小的部分,每次处理一个子数组,再把它的元素和剩余数组的组合结果拼接起来:

function cartesianProduct(arr) {
  // 递归终止条件:如果输入数组为空,返回包含空数组的结果(作为组合的起点)
  if (arr.length === 0) {
    return [[]];
  }
  
  // 取出第一个子数组,递归处理剩下的部分
  const firstGroup = arr[0];
  const remainingCombos = cartesianProduct(arr.slice(1));
  
  // 将第一个数组的每个元素,和剩余数组的所有组合逐一拼接
  return firstGroup.flatMap(item => {
    return remainingCombos.map(combo => [item, ...combo]);
  });
}

// 测试你的输入
const input_array = [ ["black", "blue"], ["large", "medium"], ["a", "b", "c"] ];
const finallist = cartesianProduct(input_array);
console.log(finallist);

这种写法代码简洁,逻辑清晰,很容易理解笛卡尔积的生成逻辑。

方案二:迭代实现

如果你担心递归可能有栈溢出风险(虽然一般输入数组不会长到那个程度),可以用迭代的方式逐步构建结果:

function cartesianProductIterative(arr) {
  // 初始结果是包含空数组的数组,作为组合的起点
  let result = [[]];
  
  // 遍历每一组可选值
  for (const group of arr) {
    const temp = [];
    // 把现有结果的每个组合,和当前组的每个元素拼接
    for (const existingCombo of result) {
      for (const item of group) {
        temp.push([...existingCombo, item]);
      }
    }
    // 更新结果为当前轮生成的所有新组合
    result = temp;
  }
  
  return result;
}

// 测试你的输入
const input_array = [ ["black", "blue"], ["large", "medium"], ["a", "b", "c"] ];
const finallist = cartesianProductIterative(input_array);
console.log(finallist);

迭代的方式从空组合开始,一步步把每组元素和现有组合结合,最终得到所有可能的结果。

两种方案都完全支持动态输入——不管你后续给input_array添加多少个子数组,它们都会自动生成对应的全组合。比如你再加入["x", "y"],结果里的每个现有组合都会分别和x、y拼接,生成更多的组合项。

内容的提问来源于stack exchange,提问作者Sarwar Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:52:35