2015-06-17 16 views
12

Die neuen Destrukturierungszuweisungsmerkmale von ES6 sind ziemlich gut bekannt (live copy auf BABELs REPL); im Fall von Variablen, die bereits existieren:ES6 Strukturierungsaufgabe?

let a, b;     // Existing variables 
let o = {a: "a", b: "b"}; // An object to get values from 
// ... 
({a, b} = o);    // Set them to the props from `o` 
console.log(a);   // "a" 
console.log(b);   // "b" 

Gibt es eine einfache Umkehrung in ES6? Festlegen von Eigenschaften für ein vorhandenes Objekt basierend auf Variablen mit demselben Namen? (Andere als die offensichtliche o.a = a; o.b = b;)

Hinweis Ich bin nicht reden, wenn Schaffung ein Objekt, könnten wir das tun, mit dem wunderbaren neuen Objektinitialisierer Syntax, die uns die Namen nicht unnötig wiederholen lässt:

let a = "a"; 
let b = "b"; 
let o = {a, b}; 

Aber wenn ich bereits ein Objekt haben, kann ich eine Art von Strukturierung Zuordnung in ES6 tun?

+1

Es klingt so, als ob die Objekt-Initialisierungskurzschrift vorhandene Objekte "erweitern" könnte. Verstehe ich richtig? – Mathletics

+0

@Mathletics: Oder ein anderer Mechanismus mit dieser Art von Ergebnis, ja. –

+0

Ich bekomme Ihre Frage nicht. Sie haben also ein existierendes Objekt '{a:" a "}'. Sie haben eine Variable b mit dem Wert "b". Was willst du genau machen? –

Antwort

10

Der nächstgelegene ich habe kommen mit ist Object.assign und ein temporäres Objekt (live copy) zu verwenden:

let a = "a", b = "b";    // The variables 
let obj = {c: "c"};    // The existing object 
Object.assign(obj, {a, b});  // "Structuring" assignment, sort of 
console.log(JSON.stringify(obj)); // "{"c":"c","a":"a","b":"b"} 

Es ist ziemlich einfach, aber es ist ein Funktionsaufruf und ein temporäres Objekt.


Update:Bergi weist darauf hin, in a comment dass there's a strawman proposal für einen := Betreiber, die dies tun wird, und einer ihrer ersten Anwendungsfälle ist in der Tat der Anwendungsfall, der mich in erster Linie auf diese Frage führen: Konstrukteurs:

// From strawman proposal linked above, doesn't actually exist yet! 
class Point { 
    constructor(x,y) { 
     this := {x,y} //define and initialize x and y properties of new object 
     // ^^ 
    } 
} 

Also, da strawman existiert, ich vermute, für jetzt wird die assign wird das Beste, was ich in ES6 tun kann.

+1

Ich kann mir nichts Besseres vorstellen. Am Ende des Tages sind Kurzschreibobjekteigenschaften die einzige Möglichkeit, Schlüssel und Wert zu reduzieren. Daher ist das Erstellen eines temporären Objekts erforderlich. – loganfsmyth

+0

@loganfsmyth: Danke. ES6 ist so reich, dass ich mich gefragt habe, ob ich etwas verpasst habe. Ich erwartete fast, dass ich eine fast sofortige Antwort bekommen würde, die auf etwas Offensichtliches hinwies und mich wie ein Tölpel anfühlte. :-) –

+0

Das ist so nah wie du wirst bekommen –

1

Einige experimentelle Sachen, aufbauend auf Ihrer Antwort.

Wenn Sie ein bisschen frech werden wollten, könnten Sie den Zuweisungsteil davon mit einem Setter emulieren. Definitiv nicht praktisch, aber es ist eine unterhaltsame Art und Weise zu sehen, wie das Verhalten aussehen könnte auf der Außenseite, wenn Sie vielleicht o[] = zuweisen könnte. (Babel)

let a = '1', b = '2'; 
let o = {z: '26'}; 

Object.defineProperty(Object.prototype, '', { 
    set: function (o) { 
    Object.assign(this, o); 
    }, configurable: true 
}); 

o[''] = {a, b}; 

Gleiche Probleme, die Sie mit Ihrer Antwort konfrontiert, eigentlich mehr, aber einige zum Nachdenken.

+1

Meine Augen tun weh. Kreativ, obwohl. –