JavaScriptで任意個の配列から1つずつ取りだした全パターンを出力

複数個の配列が与えられ、それぞれから一つずつ要素を選んだときの全ての組み合わせを出力するプログラムを紹介します。

2つの配列から選ぶならfor文を二重に回せば済みますが、任意個の配列となると途端に難しくなります。任意個にネストしたfor文を書くには再帰を用いる必要があるからです。

再帰関数を用いた方法とreduceメソッドを用いた方法の2つを紹介します。

環境

・Javascript(nodejs v10.9.0)

再帰関数を使う

引数に任意個の配列(2次元配列)を与え、全組み合わせを列挙した2次元配列を返す関数を作ります。

ロジックはこちらの記事を参考にしました。

どうでもいいようなコードをPHPで書くような記事ばっかりな訳ですが、今回もそのネタです。サンプルコードがPHPなのはご容赦くださいませ。 $a = array(1,2); $b = array('a', 'b');のとき、$aからひとつ、$bからひとつ要素を取り出して組み合わせを作る。考えうるすべての組み合わせを出力せ...

簡単に解説すると、

[['a','b'],['c','d'],['e','f'],['g','h'],....] という配列が与えられたら、

まず配列の先頭から2要素を取り出し、組み合わせを列挙した配列に差し替えます。

[['ac','ad','bc','bd'],['e','f'],['g','h'],....]

再度配列の先頭から2要素を取り出し、組み合わせを列挙した配列に差し替えます

[['ace','acf','ade','adf','bce','bcf','bde','bdf'],['e','f'],['g','h'],....]

あとはこれを配列サイズは1になるまで繰り返せばよいのです。

実装

以下のコードをcombination.jsとして保存して実行してみて下さい。

実行結果

reduceメソッドを使う

javascriptの Array.prototype.reduce メソッドを使うと同じ処理をもっと完結に書けます。

reduce() は配列の各要素に対して(引数で与えられた)reducer 関数を実行して、単一の値にします。

実行結果