Destrukturierungszuordnung im Funktionsaufruf unter Beibehaltung des Objekts [duplizieren]

8

Gibt es eine Möglichkeit, etwas wie das Folgende zu tun?

%Vor%

Um das gleiche Ergebnis wie das zu erhalten.

%Vor%

Ich möchte das Objekt innerhalb der Funktionsparameter dekonstruieren und gleichzeitig das Objekt an die Funktion übergeben, damit das Objekt geändert werden kann.

    
Diasiare 17.07.2017, 13:41
quelle

3 Antworten

4

TL; DR

Objekte - Eigenschaften verlieren:

%Vor%

Objekte - Bewahrende Eigenschaften:

%Vor%

Arrays - Elemente verlieren:

%Vor%

Arrays - Erhaltungselemente:

%Vor%

Beachten Sie, dass die obigen Beispiele, die Eigenschaften beibehalten, dasselbe -Objekt in o (oder Array in a ) verwenden, das beim Aufrufen der Funktion verwendet wurde, nicht als Kopie. Um eine flache Kopie zu verwenden, können Sie die folgenden Beispiele verwenden:

Objekte - Beibehalten der Eigenschaften, Erstellen eines neuen Objekts:

%Vor%

Arrays - Elemente erhalten und ein neues Array erstellen:

%Vor%

Erklärung

Wenn Sie alle Eigenschaften des ursprünglichen Objekts in o beibehalten möchten, benötigen Sie den expliziten Destrukturierungsschritt im Rumpf Ihrer Funktion: let { a: x } = o; , aber wenn Sie nur die Eigenschaften erhalten möchten, die nicht gesetzt wurden in x können Sie dann die Destrukturierung wie unten beschrieben verwenden (in der Zukunft, wenn sie unterstützt wird). Einzelheiten finden Sie unter Beispiele .

Beachten Sie, dass ich ursprünglich angenommen hatte, dass Sie eine Destrukturierung wie beim Destrukturieren von Arrays wollen - aber vielleicht wollen Sie das nicht - dank Karen Grigoryan, die in den Kommentaren darauf hingewiesen hat.

Eine Syntax, die logisch funktionieren sollte, wäre dies nicht:

%Vor%

aber das:

%Vor%

(Aber ich wäre (positiv) überrascht, wenn das heute auf irgendeiner Plattform oder sogar in transpilers nativ funktioniert. Dies würde Unterstützung für den Restoperator bei der Objektdestrukturierung in Kombination mit dem Entpacken von Feldern aus als Funktionsparameter übergebenen Objekten benötigen. Theoretisch gibt es keinen Grund es sollte nicht funktionieren, in der Praxis wahrscheinlich nicht.)

Beachten Sie, dass ({ a: x, ...o }) => ... beim Aufruf als f({ a: 0, b: 1 }) nur { b: 1 } in o und 0 in x setzen würde - genau wie ([x, ...a]) => ... beim Aufruf als f([0, 1]) würde nur%% setzen co_de% in [1] und würde a in 0 einfügen.

Dies bedeutet, dass die Verwendung der Destrukturierung mit Restparametern - für Objekte und Arrays - nicht das gesamte Array oder Objekt in der Restvariablen erhalten würde, sondern nur die Daten, die sonst nicht explizit erfasst wurden.

Das bedeutet, dass Sie, unabhängig davon, ob Sie Arrays oder Objekte destrukturieren, den expliziten Destrukturierungsschritt in den Rumpf Ihrer Funktionen einfügen müssen, anstatt sich auf die Parametersyntax zu verlassen, wenn Sie das ursprüngliche Array oder Objekt intakt haben wollen.

Siehe:

rsp 17.07.2017, 14:05
quelle
5

Nein, das ist nicht möglich, bedenken Sie:

%Vor%

Das Beste, was Sie mit der ES6-Implementierung tun können, ist der Zugriff auf verschachtelte Requisiten, nicht eine Referenz auf das Objekt selbst sowie verschachtelte Requisiten.

(würde gerne falsch bewiesen, obwohl, das ist ein Feature, das ich auch gesucht habe)

    
Damon 17.07.2017 14:02
quelle
0

Bei der Destrukturierung von verschachtelten Objekten können Sie einen Zuweisungsoperator verwenden, um den verschachtelten Referenzwert zu extrahieren.

%Vor%

Ebenso können Sie die Funktion caller

destrukturieren

%Vor%
    
Rick 17.07.2017 13:55
quelle