多个数组元素的组合

时间:2014-02-22 09:33:59

标签: javascript arrays algorithm

我有这种类型的数据

var arr = [
    ["A", "AA"],
    ["B"],
    ["C", "CC", "CCC"]
];

我希望得到每个数组中所有元素的组合。例如。

A B
A B C
A B CC
A B CCC
A C
A CC
A CCC
...
AA B CCC

请注意,单词的顺序是相同的,因此不应该是B A C组合之一。

我尝试了几种逻辑,但无法得到我想要的东西。我可以获得所有单词的所有排列和组合,但这不是我想要的。

请建议

3 个答案:

答案 0 :(得分:2)

您基本上想要在多个列表中进行置换:

function permute(input)
{
  var out = [];

  (function permute_r(input, current) {
    if (input.length === 0) {
      out.push(current);
      return;
    }

    var next = input.slice(1);

    for (var i = 0, n = input[0].length; i != n; ++i) {
      permute_r(next, current.concat([input[0][i]]));
    }
  }(input, []));

  return out;
}

permute(arr);

答案 1 :(得分:1)

问题可以递归解决。也就是说:对于第一个数组,对于每个元素,您有与其他两个数组形成的组合的结果。

这样的事情可行:

function arrayCombine ( array ) {
    if (array.length > 1) {
        var result = new Array();

        //This combines all the arrays except the first
        var otherCombs = arrayCombine ( array.slice(1) );

        for ( var n = 0; n < array[0].length; n++ )
            for ( var i = 0; i < otherCombs.length; i++ )
                result.push ( array[0][n] + otherCombs[i] );

        return result;                
    }

    //If we have only one array, the result is the array itself, for it contains in itself all the combinations of one element that can be made
    else return array[0];
}

答案 2 :(得分:1)

  1. 创建索引数组(idx),每个元素对应于每一行。初始值0。
  2. 以索引i = 0
  3. 开头
  4. 使用当前组合执行的操作。
  5. 增加idx[i]。如果它小于行的长度,请转到2
  6. idx[i]设为零
  7. 增加i。如果它大于行数,则终止算法,否则转到2