2016-04-28 3 views
0

Ich habe eine Funktion mit rekursiven Ansatz geschrieben, um die Werte aus verschachtelten Array zu erhalten. Das Problem ist, ich kann die globale Variable nach jedem Aufruf nicht zurücksetzen. Hier werden die Ergebnisse nach jedem Aufruf an das vorherige Ergebnis angehängt, anstatt ein neues Ergebnis zu erhalten. Ich weiß, globale Variable wird nicht zurückgesetzt, so dass Daten immer anhängen werden. Aber ich kann die Variable in der Funktion nicht als ihren rekursiven Aufruf definieren.Wie kann ich die globale Variable nach dem Aufruf der Funktion zurücksetzen?

Wie kann ich diese Situation vermeiden? Jede Hilfe wäre willkommen.

var res = []; 
function getData(arr) { 
    if(!Array.isArray(arr)) { 
    res.push(arr); 
    return res; 
    } 
    for(var i = 0; i < arr.length; i++) { 
    getData(arr[i]); 
    } 
    return res; 
} 

getData([1, [2], [3, [[4]]]]); // res = [1, 2, 3, 4] 
getData([[["a"]], [["b"]]]); // res = [1, 2, 3, 4, "a", "b"], expected is res = ["a", "b"]; 
getData([1, {}, [3, [[4]]]]); 
+2

einfach das Ergebnis Array machen ein Parameter der Funktion? 'Funktion getData (arr, res) {...}' und 'getData ([...], [])'. –

+0

@FelixKling Thanks..es ist ein guter Ansatz, aber ich muss keinen zusätzlichen Parameter übergeben. –

Antwort

1

Aber ich kann nicht die Variable innerhalb der Funktion als rekursive Aufruf definieren.

Sie können das Ergebnis Variable innerhalb der Funktion definieren, aber Sie müssen richtig mit den Rückgabewerten Ihrer rekursive Aufrufe behandeln:

function getData(arr) { 
    var res = []; 

    if (Array.isArray(arr)) { 
     for (var i = 0; i < arr.length; i++) { 
      res = res.concat(getData(arr[i])); 
     } 
    } else { 
     res.push(arr); 
    } 

    return res; 
} 

(Und Sie brauchen nicht das Ergebnis-Array ein machen Parameter der Funktion.)

+0

danke, es hat funktioniert. –

-1

Verwenden Sie pop (array_name), um das letzte Element aus dem Array zu entfernen, nachdem Sie damit fertig sind.

- Ada

0

Geladen mit einer anderen Lösung mit Verschluss, könnte es jemandem helfen.

function getData(arr) { 
    var res = []; 
    return innerGetData(arr); 

    function innerGetData(arr) { 
    if(!Array.isArray(arr)) { 
     res.push(arr); 
     return res; 
    } 
    for(var i = 0; i < arr.length; i++) { 
     innerGetData(arr[i]); 
    } 
    return res; 
    } 
} 
0

Hey eine Variante der Lösung oben ist:

function steamrollArray(arr) { 
 
    var newArr = []; 
 
    arr.forEach(function(el){ 
 
     if(!Array.isArray(el)){ 
 
      newArr.push(el); 
 
     } else { 
 
     newArr = newArr.concat(steamrollArray(el)); 
 
     } 
 
    }); 
 

 
    return newArr; 
 
}

:)

Verwandte Themen