如何实现任意数量数组的笛卡尔积生成?(JavaScript场景)
实现任意数组的笛卡尔积生成函数
要生成任意数量数组的所有元素组合(笛卡尔积),可以用递归或数组reduce两种方式实现,以下是具体代码:
递归实现
递归方式逻辑直观,适合理解笛卡尔积的生成过程:
function magicfunction(arrays) { // 空输入直接返回空数组 if (arrays.length === 0) return []; // 只剩一个数组时,将每个元素转为单元素数组返回 if (arrays.length === 1) return arrays[0].map(item => [item]); // 拆分第一个数组和剩余数组 const first = arrays[0]; const restProducts = magicfunction(arrays.slice(1)); // 组合第一个数组的每个元素与剩余数组的笛卡尔积结果 return first.flatMap(item => restProducts.map(product => [item, ...product])); }
迭代实现(reduce方式)
用数组reduce方法可以写出更简洁的代码,核心是逐步累积笛卡尔积结果:
function magicfunction(arrays) { return arrays.reduce((accumulator, currentArray) => { // 将累积的结果与当前数组的每个元素组合,再展开为一维数组 return accumulator.flatMap(prevCombination => currentArray.map(item => [...prevCombination, item]) ); }, [[]]); // 初始值设为包含空数组的数组,作为组合的起点 }
测试示例
用你提供的数组测试:
let array1 = ["lion","tiger","bear"]; let array2 = ["cat","dog","snake"]; let array3 = ["cockroach","spider","slug"]; console.log(magicfunction([array1,array2,array3]));
输出会符合你期望的格式,包含所有3×3×3=27种元素组合。
这两种实现都支持任意数量的输入数组,不管是2个、3个还是更多,完全满足你提前生成查询列表的需求。
内容的提问来源于stack exchange,提问作者user1672528
相关产品推荐
相关产品推荐

