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

如何实现多数组元素的全排列组合生成唯一名称数组?

问题:生成多维数组的全组合结果

我有如下多维数组:

var arr = [
    ['Red', 'Black'],
    ['S', 'M'],
    ['Cotton', 'Linen']
];

希望生成包含所有可能组合的结果数组,格式如下:

result: [
   'Red - S - Cotton',
   'Red - M - Cotton',
   'Red - S - Linen',
   'Red - M - Linen',
   'Black - S - Cotton',
   'Black - M - Cotton',
   'Black - S - Linen',
   'Black - M - Linen'
]

我之前编写的JavaScript代码无法得到预期结果,存在重复项且缺失部分组合(比如缺少'Black - M - Cotton'),以下是我的代码:

var arr = [
      ['Red', 'Black'],
      ['S', 'M'],
      ['Cotton', 'Linen']
    ]
    
    var sum = 1;
    for (var i = 0; i < arr.length; i++) {
      sum *= arr[i].length;
    }
    
    function FullRow(arr, len) {
      var index = 0
      var result = []
      var current = 0
      while (index < len) {
        if (current === arr.length)
          current = 0
        result[index] = arr[current]
        index++
        current++
      }
      return result
    }
    
    function Combine(arr, len) {
      var result = arr[0];
      for (var index = 1; index < arr.length; index++) {
        for (var current = 0; current < len; current++) {
          result[current] += ' - ' + arr[index][current];
        }
      }
      return result;
    }
    
    var combineArr = [];
    for (var i = 0; i < arr.length; i++) {
      combineArr.push(FullRow(arr[i], sum));
    }
    
    console.log('----COMBINE----')
    var finalArr = Combine(combineArr, sum)
    
    console.log(finalArr)

请问该如何修改代码以得到符合需求的结果?


解决方案

你的代码问题在于FullRow生成的序列逻辑错误,导致后续组合时无法正确匹配所有排列。可以换用以下两种更可靠的方式实现:

方法1:迭代拼接法

逐层遍历数组,将已有组合与当前层元素逐一拼接:

var arr = [
    ['Red', 'Black'],
    ['S', 'M'],
    ['Cotton', 'Linen']
];

function generateCombinations(arr) {
  // 初始结果为第一个数组的元素副本
  let result = arr[0].slice();
  // 从第二个数组开始遍历
  for (let i = 1; i < arr.length; i++) {
    const temp = [];
    // 遍历已有结果,和当前数组的每个元素拼接
    for (const prev of result) {
      for (const curr of arr[i]) {
        temp.push(`${prev} - ${curr}`);
      }
    }
    // 更新结果为新生成的组合
    result = temp;
  }
  return result;
}

const finalArr = generateCombinations(arr);
console.log(finalArr);

方法2:递归深度遍历法

适用于维度不固定的多维数组,通过递归逐层构建组合:

var arr = [
    ['Red', 'Black'],
    ['S', 'M'],
    ['Cotton', 'Linen']
];

function generateAllCombinations(arr, index = 0, current = '', result = []) {
  // 遍历到最后一层时,将当前组合存入结果
  if (index === arr.length) {
    result.push(current.trim());
    return result;
  }
  // 遍历当前层的每个元素,递归拼接下一层
  for (const item of arr[index]) {
    const newCurrent = current ? `${current} - ${item}` : item;
    generateAllCombinations(arr, index + 1, newCurrent, result);
  }
  return result;
}

const finalArr = generateAllCombinations(arr);
console.log(finalArr);

以上两种方法都能正确生成所有8种组合,解决原代码中重复和缺失的问题。

内容的提问来源于stack exchange,提问作者Ryan can fly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:40:57