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

如何在TypeScript中生成数组数组的所有元素排列并执行操作

实现数组数组的全组合递归处理函数

嘿,我来帮你搞定这个需求!你要实现的其实是计算数组的笛卡尔积——也就是从每个子数组中挑选一个元素,生成所有可能的组合,然后对每个组合执行指定操作。下面是针对TypeScript的完整递归实现方案:

核心实现代码

// 定义回调函数的类型,支持任意元素类型
type PermutationCallback<T> = (permutation: T[]) => void;

/**
 * 递归生成数组数组的所有组合,并对每个组合执行回调
 * @param arrays 输入的数组的数组
 * @param callback 每个组合生成后要执行的回调函数
 * @param current 内部跟踪的当前组合,无需手动传入
 */
function recursePermutations<T>(arrays: T[][], callback: PermutationCallback<T>, current: T[] = []): void {
  // 终止条件:当前组合的长度等于输入数组的长度,说明已经生成一个完整组合
  if (current.length === arrays.length) {
    // 传入组合的副本,避免后续回溯修改影响回调内的数据
    callback([...current]);
    return;
  }

  // 获取当前需要处理的子数组
  const currentSubArray = arrays[current.length];
  
  // 遍历当前子数组的每个元素,递归构建组合
  for (const item of currentSubArray) {
    // 将当前元素加入临时组合
    current.push(item);
    // 递归处理下一个子数组
    recursePermutations(arrays, callback, current);
    // 回溯:移除当前元素,准备尝试子数组的下一个元素
    current.pop();
  }
}

测试你的示例

用你提供的测试代码验证一下:

const arrOfArrays = [ [1], [2, 3, 4], [5, 6], [7, 8] ];
recursePermutations(arrOfArrays, permutation => {
  console.log(permutation);
});

运行后就会输出你期望的所有组合,比如:

[ 1, 2, 5, 7 ]
[ 1, 2, 5, 8 ]
[ 1, 2, 6, 7 ]
[ 1, 2, 6, 8 ]
...(后续所有组合)

关键细节说明

  • 泛型支持:用<T>让函数兼容任意类型的元素,不管是数字、字符串还是自定义对象都能处理
  • 回溯机制:通过push和pop来维护当前组合,确保递归返回后能正确尝试下一个元素,不会遗漏任何组合
  • 副本传递:在触发回调时传入[...current]而不是直接传current,因为数组是引用类型,避免后续回溯修改破坏回调中使用的组合数据
  • 空数组处理:如果输入的子数组中有空数组,函数不会生成任何组合(因为无法从空数组中挑选元素,逻辑上没有有效组合)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:02:44