2015-06-17 31 views
12

Le nuove funzioni di assegnazione destrutturante di ES6 sono abbastanza conosciute ora (live copy su REPL di Babel); nel caso di variabili che già esistono:Assegnazione strutturazione ES6?

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" 

C'è una semplice Converse in ES6? Impostazione delle proprietà su un oggetto esistente in base a variabili con lo stesso nome? (Altro che l'ovvio o.a = a; o.b = b;)

Nota Non sto parlando di quando creazione un oggetto, potremmo farlo con la meravigliosa nuova sintassi di inizializzazione degli oggetti che ci permette di non ripetere i nomi inutilmente:

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

Ma se io già ho un oggetto, posso fare una specie di strutturazione dell'assegnazione in ES6?

+1

Sembra che si desideri che l'inizializzatore dell'oggetto sia in grado di estendere gli oggetti esistenti. Ho capito bene? – Mathletics

+0

@Mathletics: O qualche altro meccanismo con quel tipo di risultato, sì. –

+0

Non ricevo la tua domanda. Quindi hai un oggetto esistente '{a:" a "}'. Hai una variabile b con il valore "b". Cosa vuoi fare esattamente? –

risposta

10

Il più vicino che è venuta in mente è quello di utilizzare Object.assign e un oggetto temporaneo (live copy):

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"} 

è abbastanza semplice, ma è una chiamata di funzione e di un oggetto temporaneo.


Aggiornamento:Bergi punti su in a comment che there's a strawman proposal per un := operatore che farà questo, e uno dei loro primi casi d'uso è davvero il caso d'uso che in primo luogo mi portano a questa domanda: Costruttori:

Quindi dato che lo strawman esiste, ho il sospetto che per ora il assign sarà il meglio che posso fare in ES6.

+1

Non c'è niente che io possa pensare meglio di questo. Alla fine della giornata, le proprietà degli oggetti abbreviazioni sono l'unico modo per comprimere la chiave e il valore, quindi è necessario creare un oggetto temporaneo. – loganfsmyth

+0

@loganfsmyth: Grazie. ES6 è così ricco che mi stavo chiedendo se mi fosse sfuggito qualcosa. Mi aspettavo quasi di ottenere una risposta quasi istantanea che indicasse qualcosa di ovvio e mi sentissi come un idiota. :-) –

+0

Questo è il più vicino che hai da ottenere –

1

Alcune cose sperimentali, sulla base della risposta.

Se si desidera ottenere un po 'sfacciato si potrebbe emulare la porzione di incarico di esso con un setter. Sicuramente non pratico, ma è un modo divertente per vedere quale potrebbe essere il comportamento dall'esterno, se forse fosse possibile vuoto assegnare o[] =. (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}; 

stessi problemi da affrontare con la vostra risposta, in realtà più, ma alcuni spunti di riflessione.

+1

Mi fanno male gli occhi. Creativo, però. –