2017-05-18 3 views
1

Ich brauche Hilfe, wie man durch dieses Array von variablen Array-Größen durchläuft.Wie kann ich ein Array in Javascript durchlaufen?

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

Was ich will das Ergebnis in einem Array mit den Kombinationen sein.

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]....] 

Ich hoffe, das macht Sinn, was ich tun möchte.

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 
    } 
} 

Was ich schließlich tun möchte, ist nehmen von Listen (vom Benutzer festgelegten Menge von Listen) eingestellt und eine Kombination über die Listen machen. Beispiel 4 listet unten auf.

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

so x [i] [ii] .... – epascarello

+0

Ja x [0] [0] das erste Element in Elemente y [0] und x [0] [1 ] ist das erste Element in y [1] – user1854438

+0

so loop and push .... – epascarello

Antwort

4

Das sieht aus wie cartesian product und Sie können Rekursion mit einer for Schleife verwenden, um dies zu tun.

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

Sehr nützlich. Vielen Dank! – user1854438

+0

ist die Funktion 'generate' tail-recursive one? Ich bin mir nicht sicher, da es Inside-Loop genannt wird – 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, []); 

Ausgang:

[ 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 ] 
Verwandte Themen