如何在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
相关产品推荐
相关产品推荐

