2016-10-01 6 views
2

Ich arbeite an einem Problem, in dem ein Array als destrukturiertes Argument an eine Funktion übergeben wird, die dann verwendet wird, um rekursiv den Wert jedes Zahlenelements im Array zu verdoppeln. (Der Zweck der Übung ist es, eine Lösung zu entwickeln, ohne Verwendung von Array-Hilfsmethoden)Verständnis destructured Argumente rekursive Funktion

const numbers = [1, 2, 3] 
// should return '[2, 4, 6]' 

Hier ist die Lösung, die ich gefunden habe:

function double([first, ...rest]) { 
    if (rest.length) { 
    return [first * 2, ...double(rest)]; 
    } else { 
    return [first * 2]; 
    } 
} 

(FWIW habe ich auch bemerkt, dass diese Lösung funktioniert, wenn Sie die else Bedingung weglassen.)

Ich bin schwer zu verstehen, wie die Operation first * 2 im zweiten Block zu rest als Parameter zu übersetzt wird ...double(rest). Alle relevanten Eingaben/Referenzen würden sehr geschätzt!

+1

Sie 'Rückkehr zuerst sprechen Sind [* 2]; 'im Block 'else'? Es hat nichts mit Ruhe zu tun. –

+0

Es ist rekursiv, es nimmt eine beliebige Anzahl von Argumenten auf. Das erste Argument wird immer als "first" definiert, während der Rest der Argumente Restargumente verwendet und ein Array ist. Dann übergibt er diese Argumente an den nächsten rekursiven Aufruf, wobei die erste Zahl im Array 'rest' als 'first' zum nächsten Aufruf usw. übergeben wird, bis keine Argumente mehr vorhanden sind. – adeneo

+0

Es wäre etwas besser, die Null zu machen check für den Fall des leeren Arrays (in diesem Fall wird 'first'' undefined', und du solltest '[]') zurückgeben. Dann würde es mit einem leeren Array einen Input geben, was jetzt nicht der Fall ist. –

Antwort

1

Brechen Sie Code unten ...

[first, ...rest] = [1,2,3] //returns first = 1; rest = [2,3] 

Im zweiten Aufruf, ohne die Ausbreitung mit ..

[1 * 2, double(rest)] //rest = [2,3] 
[first, ...rest] = [2,3] //returns first = 2, rest = 3 
[1*2, [2*2, double(rest)] 

Im dritten Anruf, ohne die Ausbreitung mit ..

[1*2, [2*2, double(rest)]//rest = [3] 
[first, ...rest] = [2,3] //returns first = 2, rest = [3] 
[1*2, [2*2, [3*2]] 

was ergibt [2,[4,[6]]]

Durch die ...double() statt double() verwenden, wird das Array flach sein und kehrte als [2,4,6]

Unter dem Beispiel ohne spread(...)

function double([first, ...rest]) { 
 
    if (rest.length) { 
 
    return [first * 2, double(rest)]; 
 
    } else { 
 
    return [first * 2]; 
 
    } 
 
} 
 

 
console.log(double([1,2,3]))

+0

schön! Ich sehe jetzt, wie ich den abflachenden Aspekt der Verwendung dieser destrukturierten Syntax übersehen habe –