2017-02-10 7 views
0

Ich versuche, eine rekursive Funktion zu schreiben, die ein Array mit geschachtelten Arrays übernimmt und alle Werte in einem einzigen Array setzt. Im Moment funktioniert es manchmal, aber manchmal nicht.Verwirrt über irreführende Funktionen

function steamrollArray(arr) { 
 
    var newArr = []; 
 
    
 
    var func = function(array){ 
 
     for(i=0; i<array.length; i++){ 
 
     if(Array.isArray(array[i])){ 
 
      func(array[i]); 
 
     } 
 
     else { 
 
      newArr.push(array[i]); 
 
     } 
 
     } 
 
    }; 
 
    
 
    func(arr); 
 
    return newArr; 
 
}

Als ich steamrollArray([1, [2], [3, [[4]]]]) laufen funktioniert es, aber wenn ich steamrollArray([[1], [[2]], [3, [[4]]]]); laufen sie das 2 aus irgendeinem Grund nicht enthalten, und wenn ich steamrollArray([1, [], [3, [[4]]]]) mein Browser stürzt ab laufen. Danke für jede Einsicht, die Sie geben können!

+0

Ich empfehle Schreiben in die Konsole und zu sehen, wo es abstürzt. Hast du das schon probiert? – Forklift

+0

habe ich mit dem ersten und zweiten Beispiel gemacht. Der erste macht alles perfekt, und das zweite Beispiel sieht aus, als würde alles funktionieren, aber es überspringt die zweite Schleife aus irgendeinem Grund. Ich habe nicht einmal mit dem, der den Browser abgestürzt ist, herumgespielt. – Alex

Antwort

3

Ihr Problem ist die i im globalen Bereich ist, müssen Sie es vor Ort zu erklären, so fügen let i

function steamrollArray(arr) { 
 
    var newArr = []; 
 
    
 
    var func = function(array){ 
 
     for(let i=0; i<array.length; i++){ 
 
     if(Array.isArray(array[i])){ 
 
      func(array[i]); 
 
     } 
 
     else { 
 
      newArr.push(array[i]); 
 
     } 
 
     } 
 
    }; 
 
    
 
    func(arr); 
 
    return newArr; 
 
} 
 

 
console.log(steamrollArray([[1], [[2]], [3, [[4]]]])); 
 
console.log(steamrollArray([1, [], [3, [[4]]]]));

Ansonsten jedes Mal, wenn Sie die Funktion, die i erhöht anrufen und Sie kann gehen aus der Bindung (wie in Ihrem letzten Beispiel) oder überspringen ein Element (wie im zweiten Beispiel)

+1

Vielen Dank! Ich dachte irgendwie, dass es damit zu tun hat, aber ich konnte nicht herausfinden, warum es sich wie eine globale Variable verhalten würde. Gibt es einen Unterschied zwischen der Verwendung von "Let" und "Var"? – Alex

+0

Macht nichts, ich habe es gegoogelt! Danke noch einmal! – Alex

+2

[Unterschied zwischen 'let' und' var'] (http://stackoverflow.com/questions/762011/whats-the-difference-between- using-let-and-var-to-declare-a-variable). In diesem Fall: kein effektiver Unterschied. – GolezTrol