Wie destrukturiere ich alle Eigenschaften in den aktuellen Geltungsbereich/Schließung in ES2015?

Lesezeit: 5 Minuten

Wie destrukturiere ich alle Eigenschaften in den aktuellen GeltungsbereichSchliesung in
Design widerstehen

Ich möchte so etwas tun:

const vegetableColors = {corn: 'yellow', peas: 'green'};

const {*} = vegetableColors;

console.log(corn);// yellow
console.log(peas);// green

Ich kann anscheinend nicht finden oder herausfinden, wie das geht, aber ich dachte wirklich, ich hätte es schon einmal irgendwo gesehen! 😛

HINWEIS: Ich benutze Babel mit stage einstellen 0;

KONTEXT: Ich versuche trockener zu sein JSX und nicht Referenz this.state oder this.props überall, überallhin, allerorts. Und Sie müssen auch nicht ständig Eigenschaften zur Destrukturierung hinzufügen, wenn sich die Daten ändern.

  • Bitte versuchen Sie herauszufinden, wo Sie das schon einmal gesehen haben, ich würde diesen Artikel gerne lesen

    – Bergi

    9. August 2015 um 19:26 Uhr

  • Nehmen wir an, Sie könnten das tun. Also, was wäre die nächste Aussage? Wie würden Sie Code schreiben, der die Variablen verwendet, die aus einer solchen Deklaration herausspringen, wenn Sie nicht im Voraus wissen, wie sie heißen?

    – Spitze

    9. August 2015 um 19:27 Uhr

  • @Pointy, der Punkt wäre, dass Sie, wenn Sie eine Dienstprogrammbibliothek wie Underscore oder Ramda verwenden, nicht ständig zum Anfang Ihrer Datei zurückkehren und die Zeile bearbeiten müssen, in der Sie Ihre Funktionen jedes Mal nach Namen importieren, wenn Sie a verwenden neue (oder voranstellen _. oder R. zu jedem Funktionsaufruf).

    – Jona

    29. Mai 2016 um 23:01 Uhr

  • @Jonah, das klingt nach einem ernsthaften Codegeruch. Die willkürliche Verschmutzung Ihres Namensraums scheint ein Rezept für eine ständige potenzielle Katastrophe zu sein.

    – Spitze

    29. Mai 2016 um 23:39 Uhr

  • @Pointy, wollen Sie damit sagen, dass es unmöglich ist, sich in einer Situation zu befinden, in der Sie mit einer Dienstprogrammbibliothek vertraut sind und nur ihre Funktionen nutzen möchten? Was, wenn Sie schrieb die Bibliothek? Was genau ist diese „potenzielle Katastrophe“? Dass Sie vergessen haben, dass die Bibliothek eine Funktion namens X hat?

    – Jona

    29. Mai 2016 um 23:44 Uhr

1645719909 374 Wie destrukturiere ich alle Eigenschaften in den aktuellen GeltungsbereichSchliesung in
Bergi

Ich glaube du suchst die with Aussagees tut genau das, wonach Sie fragen:

const vegetableColors = {corn: 'yellow', peas: 'green'};
with (vegetableColors) {
    console.log(corn);// yellow
    console.log(peas);// green
}

Wie auch immer es ist veraltet (im strikten Modus, der ES6-Module enthält), aus gutem Grund.

alle Eigenschaften in den aktuellen Geltungsbereich zerlegen

In ES6 geht das nicht1. Und das ist gut so. Seien Sie explizit in Bezug auf die Variablen, die Sie einführen:

const {corn, peas} = vegetableColors;

Alternativ können Sie das globale Objekt mit erweitern Object.assign(global, vegetableColors) sie in den globalen Geltungsbereich zu stecken, aber wirklich, das ist schlimmer als a with Aussage.

1: … und obwohl ich nicht weiß, ob es einen Entwurf gibt, um solche Dinge in ES7 zuzulassen, kann ich Ihnen sagen, dass jeder Vorschlag vom TC vernichtet wird 🙂

  • Eigentlich erinnerte ich mich nur an meine ältere Antwort und dachte nicht darüber nach this auch sofort 🙂

    – Bergi

    9. August 2015 um 19:51 Uhr

  • Ich wusste davon with und ich würde das nie benutzen, aber es ist genau das, worum ich bitte … Mist! Was habe ich mir dabei gedacht!? 😛

    – Widerstandsdesign

    9. August 2015 um 19:51 Uhr


  • Ich bin anderer Meinung, dass dies eine gute Sache ist. Sicher, es könnte sei gefährlich. Es könnte auch genau das sein, was ein Programmierer tun möchte. Die Wahl sollte er selbst treffen können. Und es ist nicht so, dass Javascript als Sprache eine harte Designhaltung gegen alles eingenommen hat, was es Ihnen ermöglicht, sich selbst in den Fuß zu schießen.

    – Jona

    29. Mai 2016 um 22:56 Uhr


  • @ Jonah: Strikter Modus ist die Designhaltung gegen Foot-Shooting und optimierungsverhindernde Features 🙂 Sie können immer noch verwenden with Wenn Sie möchten, wird es nicht aus der Sprache entfernt (hauptsächlich aus Gründen der Abwärtskompatibilität).

    – Bergi

    29. Mai 2016 um 23:01 Uhr

  • Äh, ich denke immer noch, dass dies ein nützliches Feature wäre, aber ich kann die andere Seite des Arguments sehen. Auf jeden Fall, with ist imo keine “Lösung”, denn jetzt müssen Sie Ihr gesamtes Modul einpacken with und fügen Sie eine Ebeneneinrückung hinzu, was noch schlimmer ist, als jedem Funktionsaufruf den Objektnamen voranzustellen oder alles nach Namen oben mit Destrukturierung zu importieren.

    – Jona

    29. Mai 2016 um 23:04 Uhr


Wie destrukturiere ich alle Eigenschaften in den aktuellen GeltungsbereichSchliesung in
TJ Crowder

Ich denke du suchst:

const {corn, peas} = vegetableColors;

Live auf Babels REPL


Wenn Pointy Recht hat, fragen Sie, wie das geht ohne die Namen zu kennen corn und peaskönnen Sie nicht mit destrukturierender Zuweisung.

Sie können dies nur im globalen Bereich mithilfe einer Schleife tun, aber ich bin sicher, dass Sie dies nicht im globalen Bereich tun möchten. Trotzdem, nur für den Fall:

// I'm sure you don't really want this, just being thorough
Object.keys(vegetableColors).forEach((key) => {
    Object.defineProperty(this, key, {
        value: vegetableColors[key]
    });
});

(Wurf enumerable: true dort, wenn Sie möchten, dass diese Pseudokonstanten aufzählbar sind.)

Das funktioniert auf globaler Ebene, weil this bezieht sich auf das globale Objekt.

  • ich Überlegen Was das OP sucht, ist eine Möglichkeit, die Eigenschaften eines Objekts ohne Vorkenntnis des Quellobjekts in gleichnamige lokale Variablen zu entpacken. (Ich kann mir nicht vorstellen, was das für einen Nutzen hätte.)

    – Spitze

    9. August 2015 um 19:26 Uhr

  • @Pointy: Ich habe der Frage nur für dich einen Kontext hinzugefügt 🙂

    – Widerstandsdesign

    9. August 2015 um 19:47 Uhr

  • Oder vielleicht möchten Sie 100 Eigenschaften entpacken, ohne sie alle explizit benennen zu müssen und ohne die Liste jedes Mal aktualisieren zu müssen, wenn dem Objekt eine neue Eigenschaft hinzugefügt wird.

    – Moos

    1. Mai 2020 um 19:01 Uhr

Ich würde es nicht empfehlen, aber Sie können es verwenden eval() um etwas ähnliches zu erreichen:

vegetableColors = {corn: 'yellow', peas: 'green'};

function test() {
    for ( let i=0; i < Object.keys(vegetableColors).length; i++ ) {
        let k = Object.keys(vegetableColors)[i];
        eval(`var ${k} = vegetableColors['${k}']`);
    }

    console.log(corn); // yellow
}

test();

console.log(corn); // undefined (out of scope)

844750cookie-checkWie destrukturiere ich alle Eigenschaften in den aktuellen Geltungsbereich/Schließung in ES2015?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy