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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:19:10