2017-05-18 19 views
1

この可変配列サイズの配列をループする方法については、私は助けが必要です。javascriptで配列をループするにはどうしたらいいですか?

結果を組み合わせの配列にしたいのですが。

y = [[1,8,10,13],[2,8,10,13],[3,8,10,13] 
,[1,8,11,13],[2,8,11,13],[3,8,11,13]....] 

私はこれが意味することを望むと思います。私は最終的に何をしたいのか

for(var i=0; i<x.length; i++) 
{ 
    for(var ii=0; x[i].length; ii++) 
    { 
     //At this point I have x[0], but each number needs to be part of a compination 
    } 
} 

は、リストの設定(ユーザが設定したリストの量を)取るとリスト全体を組み合わせて行うことです。例4は以下のとおりです。

1 5 8 12 
2 6 11 
3 9 
4 10 
+4

そうX [I] [II] .... – epascarello

+0

はいX [0] [0]要素yの最初の項目である[0]、X [0] [1 ]はy [1] – user1854438

+0

の最初の要素ですので、ループしてプッシュします.... – epascarello

答えて

4

これはcartesian productのように見え、あなたがこれを行うには1つのforループと再帰を使用することができます。

var x = [[1,2,3],[8],[10,11,12],[13]]; 
 

 
function cartesian(data) { 
 
    var result = []; 
 

 
    function generate(data, n, c) { 
 
    if (n == data.length) { 
 
     result.push(c.slice()) 
 
     return; 
 
    } 
 

 
    for (var i = 0; i < data[n].length; i++) { 
 
     c[n] = data[n][i]; 
 
     generate(data, n + 1, c); 
 
    } 
 
    } 
 

 
    generate(data, 0, []) 
 
    return result 
 
} 
 

 
console.log(JSON.stringify(cartesian(x)))

+0

非常に便利です。あなたにすっごくありがとう! – user1854438

+0

は 'generate'テール再帰関数ですか?内部ループと呼ばれるのでわからない – meteorzeroo

0
function makeCombo(x, pickFrom, soFar) { 

    if (pickFrom == x.length) { 
     console.log(soFar); 
     return; 
    } 

    for (var option = 0 ; option < x[pickFrom].length ; ++option) { 
     soFar.push(x[pickFrom][option]); 
     makeCombo(x, pickFrom+1, soFar); 
     soFar.pop(); 
    } 
} 

makeCombo([[1,2,3],[8],[10,11,12],[13]], 0, []); 

出力:

[ 1, 8, 10, 13 ] 
[ 1, 8, 11, 13 ] 
[ 1, 8, 12, 13 ] 
[ 2, 8, 10, 13 ] 
[ 2, 8, 11, 13 ] 
[ 2, 8, 12, 13 ] 
[ 3, 8, 10, 13 ] 
[ 3, 8, 11, 13 ] 
[ 3, 8, 12, 13 ] 
関連する問題