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

JavaScript实现任意多维数组转唯一元素组合数组的算法需求

嘿,我懂你要做的是实现多维数组的笛卡尔积对吧?这需求挺常见的,我来帮你补上核心逻辑,不管是用原生JS还是jQuery都能搞定~

核心思路:迭代式构建笛卡尔积

笛卡尔积的本质就是把每个子数组的元素和其他子数组的元素做全组合。我们可以从一个空组合开始,一步步把每个子数组的元素和现有组合拼接,最终得到所有可能的唯一组合。

原生JavaScript实现

这个版本不依赖任何库,直接用原生循环就能完成:

function cartesianProduct(arrays) {
  // 初始结果是包含空数组的集合,作为组合的基础
  let result = [[]];
  
  // 遍历输入的每个子数组
  for (let i = 0; i < arrays.length; i++) {
    const currentSubArray = arrays[i];
    const tempCombinations = [];
    
    // 把现有结果里的每个组合,和当前子数组的每个元素拼接
    for (const existingCombination of result) {
      for (const item of currentSubArray) {
        tempCombinations.push([...existingCombination, item]);
      }
    }
    
    // 更新结果为新生成的组合集合
    result = tempCombinations;
  }
  
  return result;
}

// 测试示例
const sampleInput = [['苹果', '香蕉'], ['牛奶', '酸奶'], ['面包', '蛋糕']];
console.log(cartesianProduct(sampleInput));
// 输出会是所有3类食材的组合:[["苹果","牛奶","面包"], ["苹果","牛奶","蛋糕"], ..., ["香蕉","酸奶","蛋糕"]]

jQuery版本(用$.each替代循环)

如果你习惯用jQuery的语法,也可以把逻辑封装成jQuery的工具函数,核心逻辑和原生完全一致:

$.cartesianProduct = function(arrays) {
  let result = [[]];
  
  // 用$.each遍历每个子数组
  $.each(arrays, function(_, currentSubArray) {
    const tempCombinations = [];
    
    $.each(result, function(_, existingCombination) {
      $.each(currentSubArray, function(_, item) {
        // 用concat拼接组合和元素,避免修改原数组
        tempCombinations.push(existingCombination.concat(item));
      });
    });
    
    result = tempCombinations;
  });
  
  return result;
};

// 使用示例
const sampleInput = [['a', 'b'], [1, 2], ['x', 'y']];
console.log($.cartesianProduct(sampleInput));

边界情况说明

  • 如果输入的多维数组里包含空数组,最终结果会是空数组(因为没法和空数组生成有效组合)
  • 如果输入是一维数组,结果会是每个元素单独成数组的形式,比如输入[1,2,3],输出[[1],[2],[3]],这符合笛卡尔积的定义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:44:57