2017-09-07 4 views
0

私は3つの配列を持っていますが、これらの3つの配列に基づいて一連のルールを作成する必要がありますが、すべての可能なすべての組み合わせを与える関数を書く方法のロジックには苦労しています各配列内のエントリ。だから、私は例えば、持っている:多次元Forループ

var array 1 = [1, 2]; 
var array 2 = [3, 4, 5]; 
var array 4 = [6, 7, 8, 9, 10]; 

そして私は、文字列、(私はここでうまくしようとする試みを文句を言わない)すべての可能な組み合わせのオブジェクトなどを取り戻すwan'tと思います。ですから、例えば:

var result = ["1-3-6", "2-3-6", "1,4,6"]; 

などなど、これまでのところ、私は座っとループのために作曲しようとしましたが、どこから始めれば私は本当にただわかりません。私はまた地図を見ましたが、この深いところまで行った例は見つからなかったので、マップが仕事を終わらせるかどうかはわかりませんでした。

ロードする実際のデータは、最初の配列に2つのエントリがあり、2番目の配列には7があり、最後には6があるため、作業のために84個のエントリが必要です。これは(配列3 *配列2)*配列1に基づいています。

私はそれが少し混乱していることを知っていることを願っています。 Angular JSを使用しているので、角度ソリューションまたはバニラJSソリューションを推奨しますが必須ではありません。

+0

を、私はあなたが84個のエントリのように、すべての文字列で出力配列を期待する権利推測している場合この例と文字列は、それらの位置に対応する配列からの数字を使用して形成する必要があります。 –

+1

[JavaScriptの複数配列のデカルト積の可能な複製](https://stackoverflow.com/questions/12303989/cartesian-product-of-multiple-arrays-in-javascript) –

答えて

1

あなたが探しているのは、配列のCartesian productです。再帰的で

JavaScript - Generating combinations from n arrays with m elements

Finding All Combinations of JavaScript array values

Cartesian product of multiple arrays in JavaScript

function cartesian() { 
    var r = [], arg = arguments, max = arg.length-1; 
    function helper(arr, i) { 
     for (var j=0, l=arg[i].length; j<l; j++) { 
      var a = arr.slice(0); // clone arr 
      a.push(arg[i][j]); 
      if (i==max) 
       r.push(a); 
      else 
       helper(a, i+1); 
     } 
    } 
    helper([], 0); 
    return r; 
} 

は次のように、多くの例があります:あなたは(hereから抽出された)このような関数を使用することができます

と複数(N)の配列を持つ:

Combine 2 arrays into 1 in all possible ways in JavaScript

はそれが役に立てば幸い!ループの入れ子

+0

非常に有望ですこれを持って行ってください - ありがとう:) –

1

はもう少しエレガント

function arrComb(arr1, arr2, arr3) { 
 
    var l1 = arr1.length, 
 
    l2 = arr2.length, 
 
    l3 = arr3.length, 
 
    i, j, k, res = []; 
 

 
    for (i = 0; i < l1; i++) { 
 
    for (j = 0; j < l2; j++) { 
 
     for (k = 0; k < l3; k++) { 
 
     res.push(arr1[i] + '-' + arr2[j] + '-' + arr3[k]); 
 
     } 
 
    } 
 
    } 
 
    console.log(res) 
 
} 
 

 
arrComb([1, 2], [3, 4, 5], [6, 7, 8, 9, 10]);

+0

要素を追加するたびに更新されるプロパティなので、配列の長さをキャッシュする必要はありません。それは毎回要素を数える方法ではありません。 – Spectarion

+0

私はそれをすることはできませんでしたが、それはめったに差をつけません。スニペット全体が呼び出される関数であるはずです。これを実証するだけの方法でしたか? –

0

を行います。

var array_1 = [1, 2]; 
var array_2 = [3, 4, 5]; 
var array_4 = [6, 7, 8, 9, 10]; 
var result = []; 

for (var a1 of array_1) 
{ 
    for (var a2 of array_2) 
    { 
     for (var a3 of array_4) 
     { 
      result.push("\""+a1+"-"+a2+"-"+a3+"\"") 
     } 
    } 
} 
alert("["+result+"]")