任意数量的数组及其指数的JavaScript组合

时间:2018-01-07 09:33:54

标签: javascript arrays permutation

我正在解决通过n个给定数组进行置换的一个有点奇怪的问题。

我们说我有3个阵列(但可能还有更多):

  • 长度为2的数组A: var A =新数组(1);
  • 长度为2的数组B: var B = new Array(1);
  • 长度为3的数组C: var C = new Array(2);

我想计算这3个阵列长度的所有可能排列。

结果应如下所示:

  • A [0],B [0],C [0]
  • A [0],B [0],C [1]
  • A [0],B [0],C [2]
  • A [0],B [1],C [0]
  • A [0],B [1],C [1]
  • A [0],B [1],C [2]
  • A [1],B [0],C [0]
  • A [1],B [0],C [1]
  • A [1],B [0],C [2]
  • A [1],B [1],C [0]
  • A [1],B [1],C [1]
  • A [1],B [1],C [2] ...

我实际上需要像这样的输出。我没有'关心点上分配给数组的值。

很遗憾,我没有任何可用的代码可供分享。一旦我想出一些甚至可以远程工作的东西,我就会立即更新这篇文章。

1 个答案:

答案 0 :(得分:3)

您可以将嵌套的reduce结构用于给定数组的任意长度值。



var words = [['quick', 'lazy'], ['brown', 'black', 'grey'], ['fox', 'dog']],
    result = words.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []));

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }




你可以采取更详细的方法,在那里你可以为收集的结果添加一些逻辑来进行推送。



function getCombinations(array) {
    function iter(i, p) {
        if (i === array.length) {
            result.push(p); // <==================== use the items
            return;
        }
        array[i].forEach(function (a) {
            iter(i + 1, p.concat(a));
        });
    }

    var result = [];

    iter(0, []);
    return result;
}

var words = [['quick', 'lazy'], ['brown', 'black', 'grey'], ['fox', 'dog']],
    result = getCombinations(words);

console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;