2016-03-21 11 views
1

Ich habe eine Funktion, die alle Elemente aus einem 2-dimensionalen Array durch seine Zeilen und gibt ein 1-dimensionales Array zurück. Das Array hat eine variable Anzahl von Spalten und Zeilen.Iterieren über Reihen von 2-dimensionalen Array mit Arrays unterschiedlicher Länge

Beispiel:

let arr = [ 
    [1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 10, 11, 12] 
]; 

Returns:

[1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12] 

Die Funktion kam ich mit:

convertList = (list) => { 
    let result = []; 
    let listTotalEntries = R.sum(R.map(R.length)(list)); 
    let mod = R.modulo(R.__, list.length); 

     let counterRow = -1; 

     for (let i = 0; i < listTotalEntries; i++) { 
      if (mod(i) === 0) { 
       counterRow++; 
      } 
      if (list[mod(i)][counterRow]) { 
       result.push(list[mod(i)][counterRow]); 
       console.log(list[mod(i)][counterRow]); 
      } 
     } 
     console.log(result); 
     return result; 
}; 

Frage: Diese Funktion ist nur mit quadratischen Matrizen arbeitet - wie kann Ich mache es mit einer variablen Länge der enthaltenen Arrays arbeiten?

Beispiel:

let arr = [ 
    [1, 2], 
    [], 
    [9, 10, 11, 12] 
]; 

Sollte zurück:

[1, 9, 2, 10, 11, 12] 

Vielen Dank für Ihre Hilfe!

Muff

Antwort

2

Sie hatten einen ramda.js Tag hier drin. Mit Ramda, es ist ziemlich einfach, da es zwei Funktionen, die helfen:

const convertList = compose(flatten, transpose); 
convertList(arr); //=> [1, 9, 2, 10, 11, 12] 

transpose Flips eine Matrix über seine Hauptdiagonale, das heißt, ändert Zeilen in Spalten und umgekehrt. flatten verwandelt eine Liste von Listen in eine einfache Liste.So erzeugt compose im Wesentlichen das Äquivalent von list => flatten(transpose(list)).

Sie können dies in Aktion auf der Ramda REPL sehen.

+0

Wow! Funktioniert wie ein Charme, schlank und ordentlich! Ich erkannte nicht, dass eine Funktion wie Transponierung in Ramda existiert - Es braucht einige Zeit und Erfahrung, um alle Funktionen und die damit verbundenen Möglichkeiten zu verinnerlichen. Vielen Dank! – Raggamuffin

+0

Ja, das Ramda-Team arbeitet daran, die Möglichkeiten zur Erkennung von Funktionen zu verbessern. Ein Schritt darin war [gerade gestern veröffentlicht] (https://github.com/ramda/ramda/wiki/What-Function-Should-I-Use%3F). –

+0

Großartig! * Lesezeichen * - Ich freue mich auf den Fortschritt des Handbuchs/Leitfadens. Ich habe einen für Version 0.17 gefunden, aber es schien, dass es nur einleitende Kapitel gab. Ich hoffe, dass sie weiterhin als angemessene Ergänzung zu den Dokumenten darauf schreiben. – Raggamuffin

2

Haben Sie versucht, dieses einfache?

var singleDimensionArr = arr.reduce(function(prev,current){return prev.concat(current)}); 

Zum Beispiel

[ 
    [1, 2], 
    [], 
    [9, 10, 11, 12] 
].reduce(function(prev,current){return prev.concat(current)}); 

Ausgänge [1, 2, 9, 10, 11, 12]

Edit:

Basierend auf den Eingaben von OP unten, da die Verkettung Spalte passieren muss weise

var max = Math.max.apply(null, arr.map(function (a) { return a.length; })); 
var finalArr = []; for(var i = 0; i < max; i++) 
{ 
    for(var j = 0; j < arr.length; j++) 
    { 
     arr[j][i] ? finalArr.push(arr[j][i]) : ""; 
    } 
} 
console.log(arr); 
+0

Das stimmt nicht mit dem Ergebnis überein, dass das OP hinzugefügt – Marie

+0

Sorry, ich hatte einen Tippfehler in der Return-Anweisung, 9 und 2, wo gekippt habe ich es korrigiert. Ihre Lösung wählt die Elemente nach Spalten aus - ich möchte die Elemente nach Zeilen auswählen. – Raggamuffin

+0

@Marie, weil es einen Tippfehler gab (der die Frage total änderte). – gurvinder372

2

Ich schlage vor, Schritt-für-Schritt zu gehen durch die Reihen

var arr1 = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], 
 
    arr2 = [[1, 2], [], [9, 10, 11, 12]]; 
 

 
function single(array) { 
 
    var r = [], 
 
     max = Math.max.apply(null, array.map(function (a) { return a.length; })), 
 
     i = 0, j, 
 
     l = array.length; 
 

 
    while (i < max) { 
 
     for (j = 0; j < l ; j++) { 
 
      i in array[j] && r.push(array[j][i]); 
 
     } 
 
     i++; 
 
    } 
 
    return r; 
 
} 
 

 
document.write('<pre>' + JSON.stringify(single(arr1), 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(single(arr2), 0, 4) + '</pre>');

+0

Guten einen Nina :) – gurvinder372

+0

Danke - Ich habe Ihre Lösung upvoted und überprüft, da es ein wenig kompakter ist und verwendet reduzieren und filtern. – Raggamuffin

+0

@Raggamuffin, es mag kompakter aussehen, aber es funktioniert nicht unbedingt besser als eine while-Schleife und eine for-Schleife. –

1

Dieses Beispiel macht einen großen spärlichen Array jedes Element setzen, wo es, wenn das Array war quadratisch gehören würde. Dann filtert er Nullwerte aus, die auftreten, wenn kein Eingabeelement vorhanden ist.

let arr = [ 
 
    [1, 2], 
 
    [], 
 
    [9, 10, 11, 12] 
 
]; 
 

 
var out = arr.reduce(function(o,n,i,a) { 
 
    for (var j=0;j<n.length;j++){ 
 
    o[a.length * j + i] = n[j]; 
 
    } 
 
    return o; 
 
},[]).filter(function(n) { 
 
    return n !== null; 
 
}); 
 

 
alert(JSON.stringify(out));

Verwandte Themen