2017-01-04 7 views
1

Mein Ziel ist es, eine Funktion zu schreiben, die ein Array flacht. So sollte zum Beispiel [1, [2,3]] zu [1,2,3] werden. Ich habe es mit einer rekursiven Methode wie unten beschrieben versucht, aber es erzeugt eine endlose Schleife.Javascript Rekursive Fehler

function steamrollArray(arr) { 

var resultArray = []; 

function flatArray(array) {  
    for (i = 0; i < array.length; i++){ 
    if (Array.isArray(array[i])) { 
     flatArray(array[i]); 
    } else resultArray.push(array[i]); 
    } 
} 

flatArray(arr);   
return resultArray; 
} 

steamrollArray([1, [2,3]]); 

Was ist mein Fehler?

Vielen Dank im Voraus

+1

Werfen Sie einen Blick in [ 'Array.prototype.reduce'] (https: // Entwickler .mozilla.org/de-DE/docs/Web/JavaScript/Referenz/Globale_Objekte/Array/Reduzieren). – Mouser

+2

Auch 'steamrollArray ([1, [2, 3]])' erzeugt '[1, 2, 3]' wie erwartet. – Assan

+0

ja, nur getestet, es funktioniert auf Chrome –

Antwort

5

Sie müssen auch resultArray innerhalb von flatArray und concat den rekursiven Aufruf von flatArray zu dem Ergebnis gelangen.

Es ist ein guter Ansatz, eine Rekursion vom Ende zu sehen, das heißt, Sie benötigen ein Array als Ergebnis, dann müssen Sie ein Array beim Start deklarieren und das Array zuletzt oder zwischen der Funktion zurückgeben.

Während der Verarbeitung der Daten müssen Sie das Array entweder mit einem einzelnen Element oder mit einem Array als Ergebnis eines rekursiven Aufrufs eines Sub-Arrays anhängen. Beide Teile befinden sich in der if-Klausel.

function steamrollArray(arr) { 
 
    function flatArray(array) { 
 
     var resultArray = [], // move inside 
 
      i;    // declare as well 
 
     for (i = 0; i < array.length; i++) { 
 
      if (Array.isArray(array[i])) { 
 
       resultArray = resultArray.concat(flatArray(array[i])); 
 
       // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
 
      } else { 
 
       resultArray.push(array[i]); 
 
      } 
 
     } 
 
     return resultArray; // return result here 
 
    } 
 

 
    return flatArray(arr); // return the result of the call 
 
} 
 

 
console.log(steamrollArray([1, [2, 3]])); 
 
console.log(steamrollArray([[1, 9, [7, 8]], [2,3]]));

+0

Ok, es funktioniert gut. Kannst du mir sagen, warum ich diese Änderungen machen muss? – Bene

1

können Sie einfach das tun:

var yourArray = [1, [2,3,4,5], [6,7], 8, [9]]; 
 
var result = yourArray.reduce(function(a, b) { 
 
\t if(a.constructor === Array){ 
 
\t \t return a.concat(b); 
 
\t } 
 
\t return a; 
 
}, []); 
 
console.log(result);

+0

Dies funktioniert nicht für 'tiefere' Arrays, z.B. [1, [[[2,3], 4], 5]] – Bene

Verwandte Themen