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

如何在JavaScript中用递归动态组合数组的数组

实现任意长度数组的笛卡尔积组合(JavaScript)

要实现任意长度的数组的数组的笛卡尔积组合,替代硬编码的嵌套for循环,递归是最直观的方案。以下是完整实现:

递归实现方案

function getCombinations(arrays) {
  const result = [];

  // 递归辅助函数:处理指定索引的子数组,维护当前组合路径
  function generate(index, path) {
    // 递归终止:所有子数组处理完成,保存当前组合
    if (index === arrays.length) {
      result.push([...path]);
      return;
    }

    // 遍历当前子数组的每个元素,递归构建组合
    for (const item of arrays[index]) {
      path.push(item);
      generate(index + 1, path);
      path.pop(); // 回溯,重置路径以处理下一个元素
    }
  }

  // 启动递归:从第0个子数组开始,初始路径为空
  generate(0, []);
  return result;
}

工作原理

  • generate函数负责递归构建组合:index标记当前处理的子数组位置,path记录当前已选择的元素序列。
  • 当index等于输入数组的长度时,说明已完成一组完整组合,将path的副本存入结果(使用[...path]避免后续修改影响已保存的组合)。
  • 遍历当前子数组的每个元素,将其加入path后递归处理下一个子数组;递归返回后通过path.pop()回溯,确保路径能正确切换到当前子数组的下一个元素。

使用示例

// 示例输入
const levels = [
  [{ level: 1, value: "a" }, { level: 1, value: "b" }],
  [{ level: 2, value: "c" }, { level: 2, value: "d" }],
  [{ level: 3, value: "e" }, { level: 3, value: "f" }]
];

// 获取所有组合
const combinations = getCombinations(levels);
console.log(combinations);

运行后会输出你预期的全组合结果,且支持任意长度的输入数组。

可选:非递归的Reduce实现

如果偏好更简洁的写法,也可以用数组的reduce和flatMap方法实现非递归版本:

function getCombinations(arrays) {
  return arrays.reduce((acc, curr) => {
    return acc.flatMap(prevComb => curr.map(item => [...prevComb, item]));
  }, [[]]);
}

该版本以[[]]为初始值,每次将现有组合与当前子数组的元素逐一拼接,最终生成所有笛卡尔积组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:55:34