JavaScript笛卡尔积数组:子数组前两位复制至三四位的实现
解决方案:修改笛卡尔积结果,复制前两位到指定位置
我来帮你搞定这个需求!你需要把笛卡尔积生成的每个组合里的前两位元素,复制到第3、4位的位置,同时保留后续的元素。这里有两种实用的方案,你可以根据自己的场景选择:
方案一:修改原笛卡尔积函数,直接生成目标格式
这种方法会在生成笛卡尔积的过程中直接构造出你需要的数组结构,不需要额外的后处理步骤。只需要在将组合推入结果数组时,调整数组的结构即可:
function cartesian() { var r = [], arg = arguments, max = arg.length - 1; function helper(arr, i) { for (var j = 0, l = arg[i].length; j < l; j++) { var a = arr.slice(0); // 克隆数组 a.push(arg[i][j]); if (i == max) { // 构造目标结构:前两位重复一次,再拼接原数组从第三位开始的部分 const newArr = [...a.slice(0, 2), ...a.slice(0, 2), ...a.slice(2)]; r.push(newArr); } else { helper(a, i + 1); } } } helper([], 0); return r; } var c = cartesian([0.1,0.2], [0.1,0.2],[0.8],[0.8],[0.7]); console.log(c);
运行后得到的结果就是你期望的:
[0.1,0.1,0.1,0.1,0.8,0.8,0.7], [0.1,0.2,0.1,0.2,0.8,0.8,0.7], [0.2,0.1,0.2,0.1,0.8,0.8,0.7], [0.2,0.2,0.2,0.2,0.8,0.8,0.7]
方案二:生成笛卡尔积后,批量处理结果数组
如果你还需要保留原始的笛卡尔积结果,或者不想修改原函数,可以用map方法对生成的数组进行后处理,灵活性更高:
// 保留你原来的笛卡尔积函数不变 function cartesian() { var r = [], arg = arguments, max = arg.length-1; function helper(arr, i) { for (var j=0, l=arg[i].length; j<l; j++) { var a = arr.slice(0); // clone arr a.push(arg[i][j]); if (i==max) r.push(a); else helper(a, i+1); } } helper([], 0); return r; } // 生成笛卡尔积后,处理每个组合 var c = cartesian([0.1,0.2], [0.1,0.2],[0.8],[0.8],[0.7]).map(item => { // 提取前两位元素 const [first, second] = item; // 构造新数组:前两位 + 复制的前两位 + 原数组剩余部分 return [first, second, first, second, ...item.slice(2)]; }); console.log(c);
这种方法同样能得到你想要的输出,而且原cartesian函数可以继续用于其他场景。
两种方案的对比
- 方案一:一步到位,性能略优(不需要额外遍历处理),适合只需要目标格式结果的场景。
- 方案二:不修改原函数,扩展性更强,适合需要同时保留原始笛卡尔积结果的场景。
内容的提问来源于stack exchange,提问作者HamiEbra
相关产品推荐
相关产品推荐

